3

所以我有一个 firebase 查询,其中:
user文档 - 具有Spots
posts集合的 id 数组 - 有多个post文档,每个帖子都有单个“spotId”
spots集合 - 有多个spot文档,具有唯一 id obvs

现在要仅向用户显示该用户关注的 Spot 帖子,我必须:
迭代用户“spots 数组”(他关注的点)。然后对于spot id这个数组中的每一个,我都必须对posts“spotId”==这个id的集合进行一次firebase查询。因此,当我只有那些与 Spot 用户连接的帖子时,我必须对spots集合进行另一个 firebase 查询,以获取用于帖子显示的特定 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 将为eventid 数组中的每个 ID 返回新的。因此,如果数组将为 ["1", "2"],Future.wait(posts).then((waitedPosts)则将返回 "1" 的帖子,然后返回 "2" 的帖子。

这就是为什么我做了这个奇怪的 hack - 我开始使用 flutter_bloc,所以不知道这是 hack 还是可接受的解决方案?

任何人都可以提供意见吗?

4

1 回答 1

0

如果您希望将所有结果一起提供,那么您应该使用Future.wait方法,这会将您更改List<Future<Post>>Future<List<Post>>.

于 2020-02-04T15:39:54.810 回答