Flutter/Firebase: как обрабатывать 2 потока в одном StreamBuilder?

У меня есть коллекция ChatUsers где в документах, названных UserIDЯ храню массив «UserID», добавленный в список контактов; Я хочу иметь поток с информацией о пользователях из коллекции usersкоторый зависит от этого массива в. Как я могу это сделать? Или, может быть, мне следует хранить массив карт в chatUsersизбежать двойного потока? Уже делаю правильно, что:

      //------------------------------------------------------------------------------get List of ID's users we are chatting with
Future<List<String>> getChatUsersIdList(String currentUsersId) async {
  List<String> list;
  var user = FirebaseAuth.instance.currentUser;
  final DocumentSnapshot result = await FirebaseFirestore.instance
      .collection('chatUsers')
      .doc(user!.uid)
      .get();
  list = List.castFrom(result['chatUsers']);
  print(list);
  return list;
}

//------------------------------------------------------------------------------get List of ChatUsers associated with List of IDs'
Future<List<ChatUsers>> getChatUsersList(String currentUsersId) async {
  List<String> idList = await getChatUsersIdList(currentUsersId);
  List<ChatUsers> list = [];
  late ChatUsers chatUser;
  for (int i = 0; i < idList.length; i++) {
    DocumentSnapshot val = await FirebaseFirestore.instance
        .collection('users')
        .doc(idList[i])
        .get();
    chatUser = new ChatUsers(
        uid: idList[i],
        profilePhotoUrl: val.data()!['profilePhotoUrl'],
        name: val.data()!['username'],
        email: val.data()!['email'],
        lastMessageText: 'blablablab',
        time: 'now');
    list.add(chatUser);
  }
  return list;
}

Но существует проблема. Когда я добавляю следующий идентификатор в chatUsersIDListмой `Список не обновляется. Надеюсь, кто-нибудь найдет хорошее решение!

Отредактируйте код StreamBuilder:

       StreamBuilder(
                    stream: stream,
                    builder: (context, AsyncSnapshot snapshot) {
                      if (snapshot.hasData) {
                        List val = List.castFrom(snapshot.data);
                        return Container(
                          color: Color(0xffffffff),
                          child: ListView.builder(
                            itemCount: val.length,
                            shrinkWrap: true,
                            padding: EdgeInsets.only(top: 16),
                            physics: NeverScrollableScrollPhysics(),
                            itemBuilder: (context, index) {
                              final String item = val[index].name.toString();
                              return Dismissible(
                                key: UniqueKey(),
                                onDismissed: (direction) {
                                  setState(() {
                                    val.removeAt(index);
                                  });
                                  ScaffoldMessenger.of(context).showSnackBar(
                                      SnackBar(
                                          content: Text(
                                              "Conversation with $item dismissed!")));
                                },
                                background: Container(
                                  color: Colors.red,
                                  child: Icon(Icons.delete),
                                ),
                                child: ConversationList(
                                  uid: val[index].uid,
                                  name: val[index].name,
                                  profilePhotoUrl: val[index].profilePhotoUrl,
                                ),
                              );
                            },
                          ),
                        );
                      } else
                        return Center();
                    }),

1 ответ

Мое первое предположение состоит в том, что ваш список не обновляется, потому что ваш streamBuilder наблюдает за коллекцией, а не за chatUsers коллекция, и users collection не меняется, но я просто предполагаю, так как вы не поместили фактический код StreamBuilder.

Итак, в основном вы можете попробовать использовать свой StreamBuilder в getChatUsersIdList () и внутри этого метода вызвать getChatUsersList(String idFromList)

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