我正在开发我的Flutter应用程序,我正在使用Firebase作为后端。我也使用firestore作为我的数据库。
我有这个问题,我想根据用户的选择过滤掉一些项目。我在数据服务中定义了变量filteredCategory
,并在此处创建了 setter。
void setFilteredCategory(String category) {
filteredCategory = category;
}
然后我从过滤器小部件调用了这个二传手
DataService().setFilteredCategory(category);
但是where()
方法没有任何变化。它只是忽略了这一变化。
Stream<dynamic> get getItems {
return items
.document(uid)
.collection("items")
.where("category", isEqualTo: filteredCategory)
.snapshots()
.map(_snapshotToUserData);
}
我也尝试使用sleep()
方法设置这个变量一段时间,这种方法奏效了,所以我不知道,这里出了什么问题。你有什么建议吗?
谢谢。
您的流查询可能没有更改,因为它只是作为小组件的一部分呈现。除非使用 setState 来确保使用新值重新生成查询,否则它不会更改。试试这个:
void setFilteredCategory(String category) {
setState((){
filteredCategory = category;
});
}
如果这没有您期望的结果,则可以将查询从 Widget 部分完全移动并将其传递给状态本身。
为了更新 StreamBuilder 正在使用的流,您应该将DataService().setFilteredCategory(category);
放入setState
调用中
setState((){
DataService().setFilteredCategory(category);
});
每次尝试创建一个新的items
实例,如下所示:
Stream<dynamic> get getItems {
return Firestore.instance.collection("foo").document(uid).collection("items")
.where("category", isEqualTo: filteredCategory)
.snapshots()
.map(_snapshotToUserData);