Flutter Riverpod возвращает только один элемент, хотя должен возвращать несколько
Я использую Riverpod с Flutter и Firebase в качестве базы данных. В моей базе данных есть две коллекции;Users
и .
Что я пытаюсь сделать:
- Нахождение одного документа из
Sites
-коллекция. В этом документе есть массив, содержащий идентификаторы пользователей. - Для каждого из найденных идентификаторов пользователей найдите соответствующие пользовательские документы из
User
-коллекция - вернуть поток пользователей (с их пользовательской информацией, такой как имя, адрес электронной почты и т. д.).
Что получается:
В базе данных firebase два пользователя, однако в моем виджете отображается только один.
Вопрос:
Что я делаю не так в коде? Я подозреваюIterable<UserInfoModel>? users;
перезаписывается вместо сохранения всех найденных пользователей.
Sites? site;
Iterable<UserInfoModel>? users;
final workersProvider = StreamProvider
.family
.autoDispose<WorkersDisplay, String>((ref, String siteId) {
final usersController = StreamController<WorkersDisplay>();
void notify(){
final localSite = site;
if(localSite == null){ return; }
final outputUsers = (users ?? []);
print("out: $outputUsers");
final result = WorkersDisplay(site: localSite, workers: outputUsers);
usersController.sink.add(result);
}
// watch changes to the site
final siteSub = FirebaseFirestore
.instance
.collection(FirebaseCollectionName.sites)
.where(FieldPath.documentId, isEqualTo: siteId)
.snapshots()
.listen((snapshot){
if(snapshot.docs.isEmpty){
site = null;
notify();
return;
}
final doc = snapshot.docs.first;
if(doc.metadata.hasPendingWrites){
return;
}
site = Sites(
siteId: doc.id,
json: doc.data()
);
notify();
List? workers = site?.workers;
workers?.forEach((user) {
FirebaseFirestore
.instance
.collection(FirebaseCollectionName.users)
.where(FieldPath.documentId, isEqualTo: user)
.snapshots()
.listen((snapshot2) {
users = snapshot2.docs
.where((docs) => !docs.metadata.hasPendingWrites)
.map((docs) {
String displayName = docs.data()['display_name'];
String uid = docs.data()['uid'];
String email = docs.data()['email'];
return UserInfoModel(
userId: uid,
displayName: displayName,
email: email);
}
);
notify();
});
});
notify();
});
ref.onDispose(() {
//usersSub.cancel();
siteSub.cancel();
usersController.close();
});
return usersController.stream;
});
Выход:
flutter: out: []
flutter: out: []
flutter: out: ({uid: O0gKwVhjqtQjbCWu8Gn71PoYqxP2, display_name: Bob, email: bob@bob.com})
flutter: out: ({uid: dTCuWlpUkTWlGzip6YNs, display_name: Test User, email: test@test.com})