Flutter Firestore запрос без совпадения результатов приводит к зависанию запроса при использовании orderBy - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь запросить товары в коллекции Firestore, упорядоченной по itemName. Все это прекрасно работает и правильно упорядочивает документы, когда есть документы, соответствующие запросу.

Проблема возникает, когда в запросе нет соответствующего документа и используется orderBy, кажется, что запрос никогда не завершается.

Это мой код:

CollectionReference products = Firestore.instance.collection('products');
Query query;
query = products.where('keywords', arrayContains: searchString);
query = query.orderBy('itemName', descending: false);
Stream resultsStream = query.snapshots();

StreamBuilder<Object>(
   stream: resultsStream,
   builder: (BuildContext context, AsyncSnapshot snapshot) {

          if (!snapshot.hasData) {
            return Center(child: CircularProgressIndicator());
          } else {
              if (snapshot.data.documents.length > 0) {
                  return ProductList(snapshot);
              } else {
                  return Center(child: Text('No items found'));
              }
          }

Так что, если searchString что-то вроде 'kid' и соответствует, результаты все в порядке. Если searchString 'aaaa' и не соответствует никаким результатам. Первый оператор if с !snaspshot.hasdata всегда верен, и снимок никогда не получает данные.

Странно то, что если вы удалите query.orderBy и получите результаты запроса, у которых нет соответствующего документа, он получит данные, и snapshot.hasData станет `true, затем он перейдет к следующему Если оператор и отобразить текст «Элементы не найдены».

Мне интересно, есть ли другой способ проверить, что запрос выполнен или использование !snapshot.hasData не подходит в этом случае.

Спасибо

1 Ответ

0 голосов
/ 12 февраля 2020

Попробуйте следующее:

builder: (BuildContext context, AsyncSnapshot snapshot) {
       if (!snapshot.hasData) {
            return Center(child: Text('No items found'));
          } else {
              if (snapshot.data.documents.length > 0) {
                  return ProductList(snapshot);
              } 
          }
      return Center(child: CircularProgressIndicator());
       }

Таким образом, здесь сначала на экране появится circularprogressindicator, а после завершения stream будет введено либо if, либо else в соответствии с результатом.

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