ListView.builder() во флаттере
Рассмотрим следующую функцию build()
Widget build(BuildContext context){
return MaterialApp(
home: Scaffold(
body: Center(
child: ListView.builder(
itemCount: 6,
itemBuilder: (context, i){
if(numberTruthList[i]){
return ListTile(
title: Text("$i"),
);
}
},
),
)
),
);
}
если numberTruthList равно
List<bool> numberTruthList = [true, true, true, true , true, true];
тогда выход выходит
и если numberTruthList
List<bool> numberTruthList = [false, true, true, true , true, true];
выход выходит
Я хочу, чтобы вывод был ListView с элементами
ListTile(
title: Text("$i"),
);
для значений i таких, что numberTruthList [i] равно true, каким должен быть код
4 ответа
ListView.builder(
itemCount: 6,
itemBuilder: (context, i) {
return numberTruthList[i]
? ListTile(
title: Text(numberTruthList[i].toString()),
)
: Container(
height: 0,
width: 0,
);
},
)
Использовать Wrap()
в противном случае.
Container
оборачивает контент, когда он есть, и соответствует родительскому элементу, когда нет контента.
Wrap
оборачивает содержимое несмотря ни на что.
В теле у нас есть ListView.builder с itemcount 20 и itemBuilder, который будет создавать новый виджет снова и снова до 20 раз, поскольку у нас есть itemCount=20. Если мы не используем itemCount в ListView.builder, мы получим бесконечные элементы списка, поэтому рекомендуется использовать itemCount, чтобы избежать таких ошибок.
import 'package:flutter/material.dart';
const int itemCount = 20;
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: itemCount,
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text('Contact ${(index + 1)}'),
leading: const Icon(Icons.person_outline_rounded),
trailing: const Icon(Icons.select_all_rounded),
onTap: () {
debugPrint('Contact ${(index + 1)}');
},
);
}
);
}
}
В
itemBuilder
всегда должен возвращать ненулевое значение
Widget
. Вы можете проверить это здесь .