Firestore .where никогда не возвращает результат, если нет данных Flutter Stream - PullRequest
0 голосов
/ 24 января 2020

Я хотел бы получить все сообщения пользователя из 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();
    }...

1 Ответ

0 голосов
/ 25 января 2020

здесь Об этой же проблеме сообщил пользователь

Решение проблемы состоит в том, чтобы добавить исключение к вашему пожарному депо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...