Flutter는 강력한 스크롤 가능한 위젯 시스템을 제공하며, 그 중 슬리버(Slivers)는 복잡한 스크롤 효과와 레이아웃을 만들 때 매우 유용합니다.
SliverList
는 여러 박스(children)를 주 축(main axis)으로 정렬하는 슬리버(sliver)입니다. 스크롤 가능한 영역 내에서 여러 요소를 배치할 때 유용하며, CustomScrollView
내에서 주로 사용됩니다.
delegate
: 리스트 항목을 생성하는 데 사용되는 SliverChildDelegate
를 설정합니다. 주로 SliverChildBuilderDelegate
나 SliverChildListDelegate
를 사용합니다.SliverChildBuilderDelegate
:SliverChildListDelegate
:일반적인 ListView
는 대부분의 경우 적절히 작동하지만, SliverList
는 더 많은 유연성과 성능 최적화를 제공합니다. 특히 SliverList
는 스크롤 가능한 큰 데이터 세트를 효율적으로 처리하는 데 매우 유용합니다.
SliverList
는 화면에 보이는 부분만 렌더링하여 성능을 최적화합니다. 일반적인 ListView
는 많은 데이터를 포함할 때 성능 저하가 발생할 수 있습니다.아래 예제는 SliverList
를 사용하여 스크롤 가능한 리스트를 구현하는 방법을 보여줍니다.
CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
height: 100.0,
color: index.isOdd ? Colors.white : Colors.black12,
child: Center(
child: Text('$index', textScaleFactor: 2),
),
);
},
childCount: 20, // 리스트 항목 수
),
),
],
)
SliverChildBuilderDelegate
를 사용하여 필요할 때만 항목을 생성하는 것이 좋습니다.KeepAlive
나 AutomaticKeepAlive
를 사용합니다.만약 리스트 항목들이 주 축(main axis)에서 고정된 크기를 가지고 있다면, SliverFixedExtentList
를 사용하는 것이 더 효율적입니다. SliverFixedExtentList
는 항목의 크기를 사전에 알기 때문에 레이아웃 성능이 더 뛰어납니다.
SliverChildListDelegate
와 SliverChildBuilderDelegate
는 필요할 때 자식 요소를 생성합니다. 즉, 처음에는 보이는 부분만 생성하고, 스크롤하면 필요한 부분을 추가로 생성합니다.자식 요소가 화면에서 벗어났을 때 상태를 유지하는 방법들:
KeepAlive
위젯을 사용하여 자식 요소가 화면에서 벗어나도 메모리에 유지되도록 합니다.AutomaticKeepAlive
는 자식 위젯이 필요에 따라 서브트리를 유지하도록 합니다. 예를 들어, EditableText
위젯은 입력 포커스가 있을 때 서브트리를 유지합니다.하나의 스크롤 뷰에서 여러 델리게이트를 사용할 경우, 각 델리게이트의 첫 번째 자식은 항상 레이아웃됩니다. 이는 전체 스크롤 뷰의 스크롤 오프셋을 추정하기 위해 필요합니다.
예를 들어, CustomScrollView
내에서 SliverList
와 SliverGrid
를 동시에 사용할 때, 각 델리게이트의 첫 번째 항목은 항상 화면에 그려집니다. 이렇게 하면 스크롤 뷰는 전체 길이를 더 잘 계산할 수 있습니다.