gpt4 book ai didi

firebase - 与 firebase 查询具有多重关系的 Flutter Bloc

转载 作者:行者123 更新时间:2023-12-05 07:14:08 27 4
gpt4 key购买 nike

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

现在要仅向用户显示该用户关注的点的帖子,我必须:
迭代用户“spots 数组”(他跟随的 spots)。然后,对于这个数组中的每个 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 方法的一个 Stream 但有一件事:当我将监听此 post 方法时,Firebase 将返回新的 id 数组中每个 ID 的事件。因此,如果数组为 ["1", "2"],则 Future.wait(posts).then((waitedPosts) 将为“1”返回帖子,然后为“2”返回帖子。

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

谁能帮忙出出主意?

最佳答案

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

关于firebase - 与 firebase 查询具有多重关系的 Flutter Bloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59968386/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com