我想通过用户uid从Firestore获取所有用户帖子。
但是如果我在.where内部使用过滤器->获取userPosts-> databaseReference.where ...
像这样的评论行
Stream<List<PostData>> get userPosts {
return databaseReference
// .where('uid', isEqualTo: this.user.uid)
如果Firebase中没有任何帖子,则永远不会加载任何内容,只会一直加载。但是,如果我删除/评论此行
// .where('uid', isEqualTo: this.user.uid)
它返回[]并且一切正常(即使Firebase中没有任何帖子!)。
为什么会这样?
我认为在第一种情况下它返回null?如果是这样,为什么在没有.where('uid',isEqualTo:this.user.uid)的第二种情况下,它返回的不是null?我该如何解决它或手动返回非null?为什么如果我添加.where('uid',isEqualTo:this.user.uid)并且在Firebase中没有使用该uid的帖子,它不会返回不为null的信息?
是的,我可以像现在一样在-> _postListFromSnapshot(QuerySnapshot快照)内过滤帖子。但是我不想从Firebase获取所有帖子并在_postListFromSnapshot()中对其进行过滤。
如果没有任何帖子返回[List]这样的空列表,该如何添加.where过滤器?
Stream<List<PostData>> get userPosts {
return databaseReference
this line -> // .where('uid', isEqualTo: this.user.uid)
这是我的所有代码:
final databaseReference = Firestore.instance.collection('posts');
...
// get user posts stream
Stream<List<PostData>> get userPosts {
return databaseReference
// .where('uid', isEqualTo: this.user.uid)
.orderBy('date', descending: true)
.snapshots()
.map(_postListFromSnapshot);
}
// post list from snapshop
List<PostData> _postListFromSnapshot(QuerySnapshot snapshot) {
return snapshot.documents
.where((doc) => doc.data['uid'] == user.uid)
.map((doc) {
return PostData(
date: doc.data['date'] ?? DateTime.now(),
text: doc.data['text'] ?? '',
email: doc.data['email'] ?? ''
}).toList();
}
//And here I listen to Stream and show Loading or PostsScreen
@override
Widget build(BuildContext context) {
final posts = Provider.of<List<PostData>>(context);
if (posts == null) {
return Loading();
} else {
return PostsScreen();
}...
最佳答案
here用户报告了相同的问题
该问题的解决方案是向您的Firestore添加豁免
关于firebase - Firestore .where如果没有数据,则永不返回结果Flutter Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59901558/