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. Вы можете проверить это здесь .

Другие вопросы по тегам