ListView не обновляет и не получает данные при использовании StreamBuilder и запросов из базы данных Firebase Firestore - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь получить данные из указанной c коллекции пользователей , как показано в приведенном ниже коде, но в тот момент, когда я запрашиваю пользователей в этой коллекции, просмотр списка не отображается. Другими словами, он просто отображает CircularProgressIndicator (), означающий, что данные не найдены. В тот момент, когда я закомментирую запрос where, представление списка отображается идеально.

        backgroundColor: MyApp.backgroundColor,
        body: StreamBuilder<QuerySnapshot>(
          stream: _firestore
              .collection('users')
//            .where("chapter", isEqualTo: chapter)
              .orderBy('count', descending: true)
              .snapshots(),
          builder: (context, snapshot) {
            if (!snapshot.hasData)
              return Center(child: CircularProgressIndicator());
            return ListView.builder(
              itemExtent: 80.0,
              itemCount: snapshot.data.documents.length,
              itemBuilder: (context, index) =>
                  _buildListItem(context, snapshot.data.documents[index]),
            );
          },
        ),
      );

Я пытался использовать Nested StreamBuilders и FutureBuilder в сочетании с Streambuilder, но ни одно из этих решений не работает. Должно быть простое решение для такой важной функции.

Пожалуйста, сообщите мне, как я могу одновременно запрашивать и использовать StreamBuilder.

1 Ответ

0 голосов
/ 02 марта 2020

Как показано в моем фрагменте кода ниже, хитрость заключается в том, чтобы обернуть StreamBuilder с помощью FutureBuilder. Вам нужен FutureBuilder, если вы хотите выполнять какие-либо запросы, требующие чего-то, что займет время. В моем случае, chapter должен быть загружен, чтобы просмотр списка мог запросить его. Причина, по которой просмотр списка не обновлялся данными, заключался в том, что глава была нулевой, когда просмотр списка пытался отобразить.

Примечание: если вы запрашиваете что-то, что знаете заранее, FutureBuilder не нужен. Я проверил это для жестко закодированной главы, и она отлично работает.

return FutureBuilder(
        future: _loadChapter(),
          builder: (context, snapshot) {
            return Scaffold(
              backgroundColor: MyApp.backgroundColor,
              body: StreamBuilder<QuerySnapshot>(
                stream: _firestore
                    .collection('users')
                    .where("chapter", isEqualTo: chapter)
                    .orderBy('count', descending: true)
                    .snapshots(),
                builder: (context, snapshot) {
                  if (!snapshot.hasData)
                    return Center(child: CircularProgressIndicator());
                  return ListView.builder(
                    itemExtent: 80.0,
                    itemCount: snapshot.data.documents.length,
                    itemBuilder: (context, index) =>
                        _buildListItem(context, snapshot.data.documents[index]),
                  );
                },
              ),
            );
          }
      );

Вот как выглядит метод loadChapter для справки.

 Future<void> _loadChapter() async {
    return await _populateCurrentUser(loggedInUser);
  }

_populateCurrentUser (loggedInUser) по существу находит документ, связанный с текущим вошедшим в систему пользователем, и заполняет глобальные переменные, такие как chapter .

...