Снимок Firestore, используемый во флаттере StreamBuilder, никогда не обновляется при изменении данных - PullRequest
1 голос
/ 22 марта 2020

Я нуб с флаттером, пытаюсь поработать с некоторыми примерами. Я создал виджет, который использует StreamBuilder для получения запроса из Firebase. Он отлично работает, но никогда не обновляет интерфейс при изменении данных. Я попытался прочитать об этом, и из всего, что я вижу, это должно работать из коробки. Есть ли какой-то шаг, который я пропускаю на стороне Firebase, чтобы сделать возможными изменения? Или SteamBuilder нужно как-то настроить, чтобы он время от времени извлекал данные? Код является базовым c, просто скопируйте и вставьте несколько примеров:

@override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: Firestore.instance
        .collection("XXX").orderBy('YYY')
        .where("userID", isEqualTo: userID)
        .snapshots(),
      builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (!snapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(
                valueColor: new AlwaysStoppedAnimation<Color>(
                  Color.fromRGBO(212, 20, 15, 1.0),
                ),
              ),
            );
          } else {
            // Return some list view using the data in snapshot.data.documents
          }
        }
      );
    }

[Обновить]: похоже, мои данные не обновляются даже при изменении запроса. Я предполагаю, что он использует некоторые локально кэшированные данные и не извлекает их снова с сервера.

[Обновление 2]: когда я использую запрос, который не дает результатов (например, несуществующая коллекция), вращающееся колесо просто продолжает идти. При повторном выполнении правильного запроса он возвращается к тем же старым результатам, не отражая каких-либо изменений в облаке Firebase.

[Обновление 3]: похоже, проблема связана с моим потоком, содержащим orderBy. Как только убираю что все работает нормально. Это ошибка?

1 Ответ

1 голос
/ 22 марта 2020

вам нужно создать индекс, используя поля where и orderBy:

https://firebase.google.com/docs/firestore/query-data/indexing

{
  "collectionGroup": "XXX",
  "queryScope": "COLLECTION",
  "fields": [
    {
      "fieldPath": "userId",
      "order": "ASCENDING"
    },
    {
      "fieldPath": "YYY",
      "order": "DESCENDING"
    }
  ]
},
...