Voyage_dev
항해하는 개발자
Voyage_dev
전체 방문자
오늘
어제
  • All (158)
    • Front-End (102)
      • HTML & CSS (7)
      • JavaScript (13)
      • Web & 표준 & ETC (15)
      • React (17)
      • Next (13)
      • TypeScript (6)
      • Zustand (1)
      • AWS (4)
      • Redux (1)
      • MobX (9)
      • GraphQL (1)
      • Flutter (15)
    • 알고리즘 (12)
      • Java (11)
      • JavaScript (1)
    • Git (1)
    • Project (2)
      • 개인 (1)
      • 팀 (1)
    • Books (30)
      • 누구나 자료구조와 알고리즘 (20)
      • Do It 타입스크립트 프로그래밍 (9)
    • 자료구조 (6)
    • 취업 (1)
    • 항해플러스 (1)
      • 1주 (1)

블로그 메뉴

  • 👨🏻‍💻 Github
  • 💻 Rss 블로그
  • 🏊‍♂️ Resume
  • 🗂️ Portfolio

인기 글

최근 댓글

hELLO · Designed By 정상우.
Voyage_dev

항해하는 개발자

[Flutter] GridView, CustomScrollView
Front-End/Flutter

[Flutter] GridView, CustomScrollView

2023. 10. 28. 17:44

GridView로 만드는 격자 레이아웃

GridView.builder(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2 ),
  itemCount: list자료.length,
  itemBuilder: (c, i) {
    return Container(color : Colors.grey);
  }
),
  • ListView와 똑같이 자동으로 스크롤바가 생기는 GridView
  • grid가 몇개 생성될지 미리 알고 있으면 GridView.count 쓰고
  • grid가 몇개 생성될지 아직 모르겠으면 GridView.builder 쓰면 된다
  • ListView, GridView를 쓰는데 상단엔 다른 레이아웃이 필요해서 Column 쓰면 되는데 그럼 ListView, GridView 부분만 스크롤바가 생긴다.
  • 상단고정효과를 주고 싶으면 이렇게 하면 되겠지만 여러 요소를 합쳐서 전부 스크롤바를 생성하고 싶으면CustomScrollView() 위젯을 쓰고 그 안에 여러가지 것들을 다 넣으면 된다

스크롤바 만들어주는 CustomScrollView()

CustomScrollView(
  slivers: [ 위젯1, 위젯2, 위젯3 ]
)
  • Column()이랑 같은 용도
  • 스크롤바가 생기지만 약간 문법이 다르다
  • 위처럼 쓰면 되는데 저러면 위젯 3개를 세로로 보여주는데 큰 스크롤바를 생성해 준다
  • 하지만 기존처럼 아무 위젯이나 안에 넣을 수는 없고 정해진 위젯들만 넣을 숭 ㅣㅆ다.

스크롤 영역 안에 ListView 만들고 싶으면 SliverList()

SliverList(
  delegate: SliverChildListDelegate(
    [ Text('리스트'), Text('리스트'), Text('리스트') ]
  )
),

CustomScrollView안에 GridView 만들고 싶으면 SliverGrid()

SliverGrid(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
  delegate: SliverChildListDelegate(
    [ Container(Colors.blue), Container(Colors.green), Container(Colors.yellow) ],
  ),
),
  • GridView.builder() 처럼 쓰고 싶으면 delegate: SliverChildBuilderDelegate()
SliverGrid(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
  delegate: SliverChildBuilderDelegate(
			(c,i) => Container(color: Colors.grey,
       child: Image.network(context.watch<Store1>().profileImage[i].toString()),),
       childCount:context.watch<Store1>().profileImage.length,
),

CustomScrollView 안에 박스 넣고 싶으면 SliverToBoxAdapter()

코딩애플

  • 스크롤 영역 안에 Container 하나 만들고 싶으면 쓴다
  • Child 안에 원하는 위젯을 넣으면 된다

CustomScrollView 안에 이쁜 헤더 만들고 싶으면 SliverAppBar()

SliverAppBar는 맨 위 헤더 영역을 만들어준다 근데 스크롤이 시작되면 뒷 배경이 사라지므로 그런거 만들고 싶으면 쓰면 된다.

  • pinned:true (상단고정옵션)
  • floating:true (위로 스크롤시 등장여부)
  • expandedHeight: 300 (높이 설정)
  • flexibleSpace: FlexibleSpaceBar() (앱바에 넣을 내용)

자세한건

https://api.flutter.dev/flutter/material/FlexibleSpaceBar-class.html

 

그래서 인스타그램 프로필페이지 같은 레이아웃은

  • 위엔 Container, 아래엔 GridView
  • 이 전체를 묶어서 스크롤바를 만들고 싶으면 CustomScrollView 안에 Container + GridView 넣으면 끝
  • 하지만 CustomScrollView 안에선 위젯들 이름이 다른데
  • 그냥 박스 넣을 땐 SliverToBoxAdapter()
  • GridView 넣을 땐 SliverGrid()
body : CustomScrollView(
        slivers: [
          SliverToBoxAdapter(child: ProfileHeader()),
          SliverGrid(
              delegate: SliverChildBuilderDelegate(
                      (c,i) => Container(color : Colors.grey),
                childCount: 3,
              ),
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2 ))
        ],
     )

'Front-End > Flutter' 카테고리의 다른 글

[Flutter] 주기적인 알림 띄우기  (0) 2023.10.28
[Flutter] Local Notification  (0) 2023.10.28
[Flutter] MultiProvider  (0) 2023.10.28
[Flutter] Provider  (1) 2023.10.28
[Flutter] Shared preferences  (0) 2023.10.28
    'Front-End/Flutter' 카테고리의 다른 글
    • [Flutter] 주기적인 알림 띄우기
    • [Flutter] Local Notification
    • [Flutter] MultiProvider
    • [Flutter] Provider
    Voyage_dev
    Voyage_dev

    티스토리툴바