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)