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})

0 ответов

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