所以我有一个 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 将为event
id 数组中的每个 ID 返回新的。因此,如果数组将为 ["1", "2"],Future.wait(posts).then((waitedPosts)
则将返回 "1" 的帖子,然后返回 "2" 的帖子。
这就是为什么我做了这个奇怪的 hack - 我开始使用 flutter_bloc,所以不知道这是 hack 还是可接受的解决方案?
任何人都可以提供意见吗?