Expanded( // --- (1)
child: ListView(
padding : const EdgeInsets.all(8),
children :<Widget>[
Container(height : 50 , color:Colors.amber[10]),
Container(height : 50 , color:Colors.amber[20]),
Container(height : 50 , color:Colors.amber[30]),
],//[]
),//ListView
)
Expanded(
child: ListView.builder(
shrinkWrap: true,
itemCount: allAddedCities.length, // --- (1)
itemBuilder: (BuildContext context, int index) { // --- (2)
final city = allAddedCities[index];
return Dismissible(
onDismissed: (DismissDirection dir) => _handleDismiss(dir, city),
confirmDismiss: (DismissDirection dir) async =>
dir == DismissDirection.endToStart,
background: Container(
child: Icon(Icons.delete_forever),
decoration: BoxDecoration(color: Colors.red[700]),
),
key: ValueKey(city),
child: CheckboxListTile( // --- (3)
value: city.active,
title: Text(city.name),
onChanged: (bool b) => _handleCityActiveChange(b, city), // --- (4)
),
);
},
),
)
플러터 전체에서 빌더 패턴은 자주 볼 수 있는데, 필요한 위젯을 만들 때 사용한다.
ListView.builder 생성자는 itemBuilder 프로퍼티로 콜백을 받으며 이 콜백을 통해 위젯을 반환한다. 특히 리스트에 표시해야 할 항목의 수가 아주 많거나 무한대라면 빌더 덕분에 효과적으로 화면에 항목을 그릴 수 있다. (플러터는 화면에 보이는 항목만 그린다.)
Expanded(
child: ListView.separated(
itemCount: allAddedCities.length,
itemBuilder: (BuildContext context, int index) {
final city = allAddedCities[index];
return Dismissible(
onDismissed: (DismissDirection dir) => _handleDismiss(dir, city),
confirmDismiss: (DismissDirection dir) async =>
dir == DismissDirection.endToStart,
background: Container(
child: Icon(Icons.delete_forever),
decoration: BoxDecoration(color: Colors.red[700]),
),
key: ValueKey(city),
child: CheckboxListTile(
value: city.active,
title: Text(city.name),
onChanged: (bool b) => _handleCityActiveChange(b, city),
),
);
},
separatorBuilder :(BuildContext context, int index) => const Divider(
height : 10.0
color : Colors.blue,
),
),
)
ListView.separated는 ListView.builder와 비슷하지만 두 가지 빌더 메서드를 받는다. 한 가지는 리스트 항목을 만들 때 사용(itemBuilder)하고 나머지 한 가지는 리스트 항목 간의 분리자(separatorBuilder)를 만드는 데 사용한다.
ListView.custom을 이용하면 커스텀 자식으로 리스트 뷰를 만든다. 빌더처럼 간단하지 않은데, 리스트 뷰의 항목을 각자 다른 항목으로 만들어야 한다고 할 때 사용하며 자식을 어떻게 그려야 할지 제어할 수 있다.