带firebase查询的多关系颤振块
因此,我有一个firebase查询,其中:带firebase查询的多关系颤振块,firebase,flutter,google-cloud-firestore,flutter-bloc,Firebase,Flutter,Google Cloud Firestore,Flutter Bloc,因此,我有一个firebase查询,其中: 用户文档-具有点的id数组 postscollection-有多个post文档,每个post都有一个“spotId” spot集合-具有多个具有唯一id OBV的spot文档 现在,为了只向用户显示该用户关注的帖子,我必须: 迭代用户“点数组”(他跟随的点)。然后,对于该数组中的每个spot id,我必须对posts集合进行firebase查询,其中“spotId”==此id。因此,当我只有那些与spot用户相关的帖子时,我必须对spot集合进行另一次
用户
文档-具有点的id数组
posts
collection-有多个post
文档,每个post都有一个“spotId”spot
集合-具有多个具有唯一id OBV的spot
文档
现在,为了只向用户显示该用户关注的帖子,我必须:迭代用户“点数组”(他跟随的点)。然后,对于该数组中的每个
spot id
,我必须对posts
集合进行firebase查询,其中“spotId”==此id。因此,当我只有那些与spot用户相关的帖子时,我必须对spot
集合进行另一次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));
});
});
}
}
@覆盖
流帖子(列出userfollowdspot){
流的最终列表=userFollowedSpots.map((id){
返回后收集
.其中(“spotId”,isEqualTo:id)
.快照()
.map((快照){
返回snapshot.documents.map((doc){
返回spotCollection.document(doc.data[“spotId”]).get(),然后((ds){
返回Post.fromEntity(PostEntity.fromSnapshot(doc,ds));
});
}).toList();
});
});
返回StreamGroup.merge(流列表);/>
}
然后我就这样使用它:
@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));
});
});
}
}
Stream\u mapLoadPostToState(LoadPosts事件)异步*{
列出所有帖子=[];
_订阅后?.cancel();
if(event.userFollowedSpots!=null&&event.userFollowedSpots.length>0){
_认购后=
_postRepository.posts(event.userFollowedSpots).listen((posts){
Future.wait(posts).then((waitedPosts){
如果(allPosts.length>0){
allPosts=allPosts+waitedPosts;
}否则{
allPosts=等待的posts;
}
添加(假定更新(所有职位));
});
});
}
}
问题是:这有意义吗?因为看起来有点像黑客。通常,我希望这个posts
方法有一个流,但有一件事:当我监听这个post
方法蒸汽时,Firebase将为ID数组中的每个ID返回新的事件。因此,如果数组将是[“1”,“2”],那么Future.wait(posts)。然后((waitedPosts)
将为“1”返回post,然后为“2”返回post
这就是为什么我做了这个奇怪的黑客——我开始与Flatter_bloc合作,所以不知道这是黑客还是可以接受的解决方案
有人能提供意见吗?如果你想同时提供所有结果,那么你应该使用Future.wait
方法,它会将你的List
更改为Future
在这种情况下,Future.wait将解决userfolloweredspots
项所拥有的时间-我猜这是firebase快照这就是为什么我做了这个奇怪的“命令式”把戏,在列表allPosts=[];