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

时间:2020-03-22 00:37:30

标签: firebase flutter google-cloud-firestore async-await snapshot

我是一个步履蹒跚的菜鸟,试图尝试一些例子。我创建了一个小部件,该小部件使用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的流有关。一旦我删除,一切正常。那是个错误吗?

1 个答案:

答案 0 :(得分:1)

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

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

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