Я хотел бы получить все сообщения пользователя из Firestore по пользовательскому uid.
Но если я использую фильтр с .where внутри -> get userPosts -> databaseReference.where ...
Как и в этой закомментированной строке
Stream<List<PostData>> get userPosts {
return databaseReference
// .where('uid', isEqualTo: this.user.uid)
, и если в Firebase нет сообщений, они никогда и ничего не возвращаются, просто загружаются все время. Но если я удаляю / комментирую эту строку
// .where('uid', isEqualTo: this.user.uid)
, она возвращает [], и все в порядке (даже если в Firebase нет постов!).
Почему это происходит?
Я думаю, в первом случае он возвращает ноль? Если так, то почему во втором случае без .where ('uid', isEqualTo: this.user.uid) он возвращает не ноль? Как я могу это исправить или вернуть не нуль вручную? Почему, если я добавляю .where ('uid', isEqualTo: this.user.uid) и в Firebase нет записей с этим uid, он не возвращает не нуль?
Да, я могу фильтровать сообщения inside -> _postListFromSnapshot (снимок QuerySnapshot), как я делаю сейчас. Но я не хочу получать ВСЕ сообщения из Firebase и фильтровать их внутри _postListFromSnapshot ().
Как добавить фильтр .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();
}...