Флаттер загружает элемент ListView асинхронно - PullRequest
0 голосов
/ 15 июня 2019

Как обновлять элемент ListView после каждой асинхронной задачи?

У меня есть 2 коллекции на базе Firebase, к которым необходимо получить доступ, и, пожалуйста, если есть другой способ, пожалуйста, сообщите, так как я новичок в Firebase и Flutter.

Мой users имеет коллекцию внутри, называемую favorites с полем userID (идентичным идентификатору документа), и я загружаю ListView со всеми данными пользователей, НО только с теми, которые соответствуют этим идентификаторам (чтобы избежать например, загрузка 1000 пользователей без причины = $$$).

По моему коду и тестам в окне «Выполнить» я получаю значение для каждого пользователя, но мой ListView в приложении отображается пустым. Я попытался установить сетсет, но приложение обновляется без остановки.

Я попытался создать отдельную функцию, но просто не могу получить ее, возвращая список снимков документа.

Спасибо

FutureBuilder(
              future: Firestore.instance.collection('users').document(id).collection('favorites').getDocuments(),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  List<DocumentSnapshot> userDocs = [];
                  snapshot.data.documents.forEach((doc) async {
                    await Firestore.instance.collection('users').document(doc.documentID).get().then((user) {
                      userDocs.add(user);
                    });
                  });
                  return ListView(
                    children: userDocs.map((document) {
                      return buildItem(context, document);
                    }).toList(),
                  );
                }
              },
            ),

1 Ответ

0 голосов
/ 24 июня 2019

Итак, после нескольких недель работы без какой-либо помощи я, наконец, сделал это.

  1. StreamBuilder получает только документы в избранное:

    stream: Firestore.instance.collection('u').document(id).collection('f').snapshots()

  2. ListView.Builder возвращает новый виджет (виджет StateTile с сохранением состояния)

    return MessageTile(ctx: context, doc: snapshot.data.documents[index]);

  3. Внутри виджета Statefull я нахожусьвозвращает FutureBuilder<DocumentSnapshot>, который выбирает ТОЛЬКО пользователя, соответствующего userId:

    future: Firestore.instance.collection('u').document(doc['userId']).get()

Просто верно?..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...