我是一个步履蹒跚的菜鸟,试图尝试一些例子。我创建了一个小部件,该小部件使用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的流有关。一旦我删除,一切正常。那是个错误吗?
答案 0 :(得分:1)
您需要使用where
和orderBy
字段创建索引:
https://firebase.google.com/docs/firestore/query-data/indexing
{
"collectionGroup": "XXX",
"queryScope": "COLLECTION",
"fields": [
{
"fieldPath": "userId",
"order": "ASCENDING"
},
{
"fieldPath": "YYY",
"order": "DESCENDING"
}
]
},