Flutter는 강력한 스크롤 가능한 위젯 시스템을 제공하며, 그 중 슬리버(Slivers)는 복잡한 스크롤 효과와 레이아웃을 만들 때 매우 유용합니다.
SliverGrid
는 여러 박스(children)를 2차원 배열로 배치하는 슬리버(sliver)입니다. 스크롤 가능한 영역 내에서 그리드 형태의 요소를 배치할 때 유용하며, CustomScrollView
내에서 주로 사용됩니다.
gridDelegate
: 그리드 항목의 배치를 결정하는 SliverGridDelegate
를 설정합니다. 주로 SliverGridDelegateWithMaxCrossAxisExtent
나 SliverGridDelegateWithFixedCrossAxisCount
를 사용합니다.delegate
: 그리드 항목을 생성하는 데 사용되는 SliverChildDelegate
를 설정합니다. SliverChildBuilderDelegate
나 SliverChildListDelegate
를 주로 사용합니다.SliverChildBuilderDelegate
:SliverChildListDelegate
:습니다.
아래 예제는 SliverGrid
를 사용하여 스크롤 가능한 그리드를 구현하는 방법을 보여줍니다.
CustomScrollView(
slivers: <Widget>[
SliverGrid(
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 200.0,
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 4.0,
),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment.center,
color: Colors.teal[100 * (index % 9)],
child: Text('grid item $index'),
);
},
childCount: 20,
),
),
],
)
SliverGridDelegateWithFixedCrossAxisCount
와 같은 고정 크기 배치를 사용하면 더 효율적으로 그리드를 구성할 수 있습니다.KeepAlive
나 AutomaticKeepAlive
를 사용합니다.SliverChildListDelegate
와 SliverChildBuilderDelegate
는 필요할 때 자식 요소를 생성합니다. 즉, 처음에는 보이는 부분만 생성하고, 스크롤하면 필요한 부분을 추가로 생성합니다.자식 요소가 화면에서 벗어났을 때 상태를 유지하는 방법들:
KeepAlive
위젯을 사용하여 자식 요소가 화면에서 벗어나도 메모리에 유지되도록 합니다.AutomaticKeepAlive
는 자식 위젯이 필요에 따라 서브트리를 유지하도록 합니다. 예를 들어, EditableText
위젯은 입력 포커스가 있을 때 서브트리를 유지합니다.하나의 스크롤 뷰에서 여러 델리게이트를 사용할 경우, 각 델리게이트의 첫 번째 자식은 항상 레이아웃됩니다. 이는 전체 스크롤 뷰의 스크롤 오프셋을 추정하기 위해 필요합니다.
예를 들어, CustomScrollView
내에서 SliverList
와 SliverGrid
를 동시에 사용할 때, 각 델리게이트의 첫 번째 항목은 항상 화면에 그려집니다. 이렇게 하면 스크롤 뷰는 전체 길이를 더 잘 계산할 수 있습니다.