Flutter Bloc 与 firebase 查询有多种关系

Posted

技术标签:

【中文标题】Flutter Bloc 与 firebase 查询有多种关系【英文标题】:Flutter Bloc with multiple relations with firebase query 【发布时间】:2020-05-15 00:39:36 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

如果您希望将所有结果一起提供,那么您应该使用Future.wait 方法,这会将您的List&lt;Future&lt;Post&gt;&gt; 更改为Future&lt;List&lt;Post&gt;&gt;

【讨论】:

在这种情况下,Future.wait 将解决 userFollowedSpots 项目的次数 - 我猜它是特定于 firebase 快照的。这就是为什么我做了这个奇怪的“命令式”技巧,将项目添加到List&lt;Post&gt; allPosts = [];

以上是关于Flutter Bloc 与 firebase 查询有多种关系的主要内容,如果未能解决你的问题,请参考以下文章

Stream/Bloc/Repository/Firebase 数据流 Flutter

使用 BLoC 进行 Flutter Firebase 电话身份验证

Flutter bloc 和 Firebase 电话身份验证

在加载 Firebase 快照时使用 Flutter 中的 Bloc 流式等待和阻止其他事件

具有多个firebase请求的flutter bloc cubit最佳实践

Bloc 模式是不是适合在 Flutter 应用中管理导航?