Как добавить в потокостроитель

# #flutter #google-cloud-firestore

Вопрос:

В настоящее время я просматриваю список списков, чтобы получить пользователей, которые заинтересованы в событии. У меня он установлен, initState но при добавлении или удалении идентификатора из Firestore документа изменения не отражаются в пользовательском интерфейсе. Я не хочу обновлять списки вручную. Есть ли способ переместить этот код из initState в а StreamBuilder ?

   @override
  void initState() {
    super.initState();
    final interestedUsers = widget.content.interested;

    var chunks = [];
    for (var i = 0; i < interestedUsers.length; i  = 10) {
      chunks.add(interestedUsers.sublist(i,
          i   10 > interestedUsers.length ? interestedUsers.length : i   10));
    }

    for (var i = 0; i < chunks.length; i  ) {
      final snapshot = FirebaseFirestore.instance
          .collection('users')
          .where('uid', whereIn: chunks[i])
          .snapshots();

      snapshot.forEach((element) {
        element.docs.forEach((element) {
          final userElement = UserModel.fromFirestore(element);
          setState(() {
            interested.add(userElement);
          });
        });
      });
    }
  }
 

Ответ №1:

Вы можете написать это так, как здесь…это полный пример, который обрабатывает состояние загрузки и пустоты, чтобы:

 StreamBuilder(
          stream: _firestore
              .collection('users')
          .where('uid', whereIn: chunks[i])
          .snapshots(),
          builder:
              (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {

            //Shows loading indicator
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(
                child: CircularProgressIndicator( ),
              );
            }

            List<UserNotificationListTile> items = [];
            unredNotifications = [];

            List<QueryDocumentSnapshot> groups = snapshot.data.docs;

            for (QueryDocumentSnapshot g in groups) {
              UserNotification userNotification =
                  new UserNotification.fromSnapshot(g);
              items.add(
                UserNotificationListTile(
                  userNotification: userNotification,
                ),
              );
            }


            //Shows result when there is no data
            if (items.length == 0) {
              return Center(child: NotificationsEmpty());
            }

            return Column(
              children: [
                Expanded(
                  child: ListView(
                    padding: EdgeInsets.symmetric(horizontal: 10, vertical: 0),
                    children: items.reversed.toList(),
                  ),
                ),
              ],
            );
          }),
    );
 

Комментарии:

1. Спасибо. Я постараюсь сообщить вам, как все пройдет.

2. Значит, это идет по кругу?

3. Вы помещаете это StreamBuilder в пользовательский интерфейс, как если бы это был виджет. return В builder нем это будет возвращено в виде виджетов пользовательского интерфейса.

4. да… но у тебя есть chunks[i] . Кто это i ? Там будет несколько фрагментов, каждый из которых содержит десять идентификаторов.

5. Если у вас есть вложенные списки, вы можете поместить StreamBuilder их в другой. Просто верните дочерний внутри родительского.