Flutter Blo c с несколькими связями с запросом Firebase - PullRequest
2 голосов
/ 29 января 2020

, поэтому у меня есть запрос firebase, где:
user document - имеет массив идентификаторов Spots
posts collection - имеет несколько post документов, и каждое сообщение имеет один "spotId"
spots collection - содержит несколько spot документов с уникальным идентификатором obvs

Теперь, чтобы отображать только для пользователя Сообщения о точках, за которыми следует этот пользователь, я должен:
Итерировать пользователя "массив точек" ( пятна, за которыми он следует). Затем для каждого spot id из этого массива я должен выполнить запрос firebase к коллекции posts, где «spotId» == этот идентификатор. Поэтому, когда у меня есть только те сообщения, связанные с пользователем Spot, я должен выполнить еще один запрос firebase к коллекции spots, чтобы получить эти данные c Spot для отображения сообщений.

Метод выглядит следующим образом:

@override
  Stream<List<Future<Post>>> posts(List userFollowedSpots) {
    final listOfStreams = userFollowedSpots.map((id) {
      return postCollection
          .where("spotId", isEqualTo: id)
          .snapshots()
          .map((snapshot) {
        return snapshot.documents.map((doc) {
          return spotCollection.document(doc.data["spotId"]).get().then((ds) {
            return Post.fromEntity(PostEntity.fromSnapshot(doc, ds));
          });
        }).toList();
      });
    });

    return StreamGroup.merge(listOfStreams); // <-- have to merge it as mapped userFollowedSpots returns Iterable<Stream...>>>>
  }

Тогда я использую это так:

Stream<PostsState> _mapLoadPostToState(LoadPosts event) async* {
    List<Post> allPosts = [];
    _postsSubscription?.cancel();
    if (event.userFollowedSpots != null && event.userFollowedSpots.length > 0) {
      _postsSubscription =
          _postRepository.posts(event.userFollowedSpots).listen((posts) {
        Future.wait(posts).then((waitedPosts) {

          if (allPosts.length > 0) {
            allPosts = allPosts + waitedPosts;
          } else {
            allPosts = waitedPosts;
          }
          add(PostUpdated(allPosts));
        });
      });
    }
  }

Вопрос: имеет ли смысл? Потому что выглядит как маленький взломать. Обычно я ожидаю один поток от этого posts метода, но вот что: когда я буду слушать этот post метод Steam, Firebase будет возвращать новый event для каждого идентификатора из массива идентификатора. Так что если массив будет ["1", "2"], то Future.wait(posts).then((waitedPosts) вернет сообщение для "1", а затем для "2".

Вот почему я сделал этот странный хак - я начал работать с flutter_blo c, поэтому не можете определить, является ли это хаком или приемлемым решением?

Может кто-нибудь помочь с мнением?

1 Ответ

0 голосов
/ 04 февраля 2020

Если вы хотите, чтобы все результаты были представлены вместе, используйте метод Future.wait, который изменит ваш List<Future<Post>> на Future<List<Post>>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...