
ListView는 Flutter에서 스크롤 가능한 목록을 만들기 위해 가장 많이 사용되는 위젯 중 하나이다. ListView는 여러 개의 항목을 세로로 나열하며, 사용자 상호작용 시 스크롤을 통해 콘텐츠를 탐색할 수 있도록 해준다.
ListView는 기본적으로 Column 위젯과 비슷하게 작동하지만, 스크롤 기능이 내장되어 있어 많은 양의 데이터나 UI 요소를 표시할 때 유용하다. 예제를 통해 기본적인 ListView의 사용법을 살펴보자.
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('ListView Example')),
body: ListView(
children: <Widget>[
ListTile(
leading: Icon(Icons.map),
title: Text('Map'),
),
ListTile(
leading: Icon(Icons.photo_album),
title: Text('Album'),
),
ListTile(
leading: Icon(Icons.phone),
title: Text('Phone'),
),
],
),
),
);
}
}
ListView는 데이터를 효율적으로 표시하기 위해 여러 가지 생성 방법을 제공한다. 대표적으로 다음과 같은 네 가지 방식이 있다.
ListView():
children 속성에 모든 위젯을 직접 나열한다.ListView(
children: [
Text('Item 1'),
Text('Item 2'),
Text('Item 3'),
],
)ListView.builder():
itemBuilder 콜백을 사용해 항목을 생성하므로 성능이 뛰어나다.ListView.builder(
itemCount: 1000,
itemBuilder: (context, index) {
return ListTile(
title: Text('Item $index'),
);
},
)ListView.separated():
itemBuilder와 separatorBuilder 두 개의 콜백을 통해 리스트 항목과 구분선 각각을 정의한다.ListView.separated(
itemCount: 10,
itemBuilder: (context, index) {
return ListTile(
title: Text('Item $index'),
);
},
separatorBuilder: (context, index) => Divider(),
)ListView.custom():
SliverChildDelegate를 통해 항목을 제어한다.Axis.vertical)이지만, 가로(Axis.horizontal)로도 설정할 수 있다.ListView가 Column 또는 SingleChildScrollView와 함께 사용될 때 유용하다.NeverScrollableScrollPhysics로 설정하면 스크롤을 비활성화할 수 있다.ListView.builder()와 같은 메서드는 필요한 항목만 동적으로 렌더링하므로 메모리 사용량을 줄일 수 있다.ListView() 사용 시 모든 항목이 한 번에 렌더링되므로 데이터가 많을 경우 성능 저하가 발생할 수 있다.ListView가 다른 스크롤 가능한 위젯 내부에 중첩되면 스크롤 동작이 예기치 않게 작동할 수 있다. 이 경우 shrinkWrap 및 physics 속성을 조정해야 할 수 있다.ListView.builder() 사용: 메모리 효율성과 성능을 최적화하기 위해.itemExtent 속성을 사용하여 성능을 개선할 수 있다.SingleChildScrollView나 NestedScrollView와 함께 사용하는 것이 좋다.ListView는 Flutter 앱에서 데이터를 표시하고 사용자와 상호작용할 수 있는 매우 강력하고 유연한 도구이다. 올바르게 사용하면 성능이 뛰어나고 스크롤 가능한 사용자 경험을 제공할 수 있다.