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<Future<Post>>
更改为Future<List<Post>>
。
【讨论】:
在这种情况下,Future.wait 将解决userFollowedSpots
项目的次数 - 我猜它是特定于 firebase 快照的。这就是为什么我做了这个奇怪的“命令式”技巧,将项目添加到List<Post> allPosts = [];
以上是关于Flutter Bloc 与 firebase 查询有多种关系的主要内容,如果未能解决你的问题,请参考以下文章
Stream/Bloc/Repository/Firebase 数据流 Flutter
使用 BLoC 进行 Flutter Firebase 电话身份验证
Flutter bloc 和 Firebase 电话身份验证
在加载 Firebase 快照时使用 Flutter 中的 Bloc 流式等待和阻止其他事件