ListView.builder вызывается несколько раз - PullRequest
1 голос
/ 04 мая 2020

Я пытаюсь получить данные из Firestore и отобразить их на карточках, используя ListView.builder. У меня есть логическое значение isAvailable, с помощью которого я могу sh реорганизовать порядок данных. Если это правда, он помещается вверху списка, если он ложный, он помещается внизу списка. Итак, вот частичный код,

Предположим, у меня есть класс User с соответствующими полями Firebase. Когда я вызываю эту функцию фильтра, добавляю экземпляры User и запускаю программу, список повторяется около 12 раз. Однако, если я не фильтрую содержимое и просто использую ListView.builder как есть, то он отображается правильно.

Предположим, userTile возвращает карту с пользовательским содержимым внутри.

По какой-то причине функция фильтра вызывается несколько раз, и поэтому списки добавляются также несколько раз. Есть ли работа вокруг этого? Я хочу отобразить доступный контент вверху и контент notAvailable внизу в указанном порядке.

Я также попытался использовать счетчик и убедиться, что фильтр не будет работать несколько раз, как это

int count = 0, включая for l oop с if (count < users.length) и добавлением count = count + 1 в конце.

Однако, похоже, это тоже не решает проблему.

Я не вызывал userTile в списке notAvailable, потому что я хочу, чтобы он сначала работал с доступным списком.

  List notAvailableData = [];
  List availableData = [];
  List orderedList = [];

  void filterContent(List users) {
    for (int i = 0; i < userData.length; i++) {
      User userData = users[i];
      if (userData.isAvailable == true) {
        available.add(userData);
      } else {
        notAvailable.add(userData);
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    final users = Provider.of<List<User>>(context) ?? [];
    filterContent(users);
    return ListView.builder(
      itemCount: available.length,
      itemBuilder: (context, index) {
        return _userTile(context, available[index], index);
      },
    );
  }
}

1 Ответ

0 голосов
/ 04 мая 2020

Есть десятки способов решить вашу проблему, и я просто покажу вам короткий путь; просто обновите sh свои списки (available и notAvailable) при запуске вашей функции;

void filterContent(List users) {
    available = [];
    notAvailable = [];
    for (int i = 0; i < userData.length; i++) {
      User userData = users[i];
      if (userData.isAvailable == true) {
        available.add(userData);
      } else {
        notAvailable.add(userData);
      }
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...