Поток вместо Stream <dynamic> - PullRequest
       50

Поток вместо Stream <dynamic>

1 голос
/ 05 августа 2020

Введение

Всем привет,

Я создаю функцию получения, которая должна возвращать поток с участниками беседы в чате , когда поток Firestore испускает новое значение .

поток Firestore

Stream<QuerySnapshot> theStream = Firestore.instance.collection("chat").document(uid).collection("participants").snapshots();

, где uid - уникальный идентификатор диалога.

Участники

Участник определяется Profile объект (который содержит некоторые полезные поля, такие как имя или фамилия).

class Profile {
  String uid;

  ImageProvider profilePicture;

  String firstName;
  String lastName;

  String bio;

  Profile(this.uid);

Ожидания

Я хочу выполнить некоторые Futures действия внутри моего theStream.map((snapshot) {...}), как обновление участников firstName и lastName при получении участника uid. Итак, чтобы использовать ключевое слово await, мне нужно изменить

theStream.map((snapshot) {...})

на

theStream.map((snapshot) async* {...})

Issue

В конце кода я бы объект с типом

Stream<List<Profile>>

, но у меня

Stream<Stream<List<Profile>>>

Мой код

Stream<List<Profile>> get updateParticipants() {
    Firestore.instance.collection("chat").document(uid)
        .collection("participants")
        .snapshots()
        .map((participantsSNAP) async* {
      var updates = <Future>[];

      // Pour chaque valeur du serveur
      for (var participantSNAP in participantsSNAP.documentChanges) {
        // Pour chaque valeur du cache
        for (var i = 0; i < participants.length; i++) {
          // Si serveur = cache
          if (participantSNAP.document.documentID == participants[i].uid) {
            if (participantSNAP.type == DocumentChangeType.removed) {
              participants.removeAt(i);
            } else if (participantSNAP.type == DocumentChangeType.modified) {
              updates.add(participants[i].updateUserProfile());
            }
          } else if (participantSNAP.type == DocumentChangeType.added) {
            participants
                .add(Profile(participantSNAP.document.data["participants"]));
            updates.add(participants[i].updateUserProfile());
          }
        }
      }

      await Future.wait(updates);
      participants.sort((profileA, profileB) =>
          profileA.firstName.compareTo(profileB.firstName));

      return participants
    });

Как я могу избежать этого потока в типе потока ?

...