Почему print (snapshot.hasData) возвращает true? - PullRequest
1 голос
/ 23 июня 2019

Я, должно быть, неправильно понимаю метод hasData для QuerySnaphot. В моем StreamBuilder я хочу вернуть widget, информирующее пользователя, что в запросе collection нет элементов. Я удалил коллекцию в Firestore, поэтому там точно нет данных. Но когда я запускаю следующий код:

StreamBuilder<QuerySnapshot>(
  stream: Firestore.instance
    .collection('Events')
    .where("bandId", isEqualTo: identifier)
    .snapshots(),
    builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
      if (!snapshot.hasData) {
        print('code here is being executed 1');// This gets executed
        return Text('helllllp');
      } else {
        print('Code here is being executed2'); //And this gets executed 
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            return new Text('Loading...');
          default:
            return new ListView(
              children:
                snapshot.data.documents.map((DocumentSnapshot document) {
                  return CustomCard(
                    event: document['event'],
                    location: document['location'],
                    service: document['service'],
                    date: document['date'].toDate(),
                  );
                }).toList(),
              );
            }
          }
        },
      ),

Все, что я хочу сделать, это вернуть виджет, информирующий пользователя, если снимок пуст. Например Text('You have no messages')

1 Ответ

2 голосов
/ 23 июня 2019

Проблема здесь в том, что snapshots() также вернет QuerySnapshot, когда запрос не вернет документы. Таким образом, вы можете расширить свое состояние следующим образом:

if (!snapshot.hasData || snapshot.data.documents.isEmpty) {
  return Text('You have no messages.');
} else {
  ...
}

Хотя реально вам не следует возвращать You have no messages, если snapshot.data равно null, поскольку до завершения запроса null. Следовательно, я бы пошел на что-то вроде этого:

if (!snapshot.hasData) {
  return Text('Loading...');
} 
if (snapshot.data.documents.isEmpty) {
  return Text('You have no messages.');  
}
return ListView(..);

Однако игнорируется обработка ошибок, которая также может быть добавлена.
Обратите внимание , что snapshot.hasData является альтернативой определению состояния соединения с помощью snapshot.connectionState.

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