Flutter StreamBuilder 中使用的 Firestore 快照在数据更改时永远不会更新

Firestore snapshot used in flutter StreamBuilder never gets updated when data changes

我是一个 flutter 菜鸟,正在尝试使用一些示例。我创建了一个小部件,它使用 StreamBuilder 从 Firebase 中提取一些查询。它工作得很好,但它从不在数据更改时更新 UI。我试着阅读它,从我所看到的一切来看,这应该是开箱即用的。在 Firebase 方面我是否缺少一些步骤来启用更改?或者 SteamBuilder 是否需要以某种方式进行配置,以便每隔一段时间提取一次数据? 代码是基本的,只需从一些示例中复制粘贴即可:

@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 的流有关。一旦我删除一切正常。那是一个错误吗?

您需要使用 whereorderBy 字段创建索引:

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

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