过滤器的更改不刷新显示数据,我如何要求futurebuilder基于new where((查询重新构建?
这是我的代码:
FutureBuilder<QuerySnapshot>(
future:FirebaseFirestore.instance.collection("Posts").where('region', isEqualTo: filterSelected).orderBy('date', descending: true).get(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot)
{
return ListView.builder(
itemCount: snapshot.data.docs.length,
itemBuilder: (context, index){
DocumentSnapshot Post = snapshot.data.docs[index];
.........)
filterSelected是来自我的筛选屏幕的变量回调:
onPressed: () =>
{
Navigator.push<dynamic>(
context,
MaterialPageRoute<dynamic>(
builder: (BuildContext context) => FiltersScreen((value){
return filterSelected = value;
}),
fullscreenDialog: true),
),
}
我的预期结果是,一旦用户点击过滤器,ListViewer将自动更新
我读过几篇文章,说使用async、setState、get((.then((,不确定哪一个是更好的解决方案,以及我如何添加到代码中,非常感谢!
不要在"未来:;FutureBuilder的论点。如中所述https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html:
future必须提前获得,例如在State.initState、State.didUpdateWidget或State.didChangeDependencies期间。在构造FutureBuilder时,不能在State.build或StatelessWidget.build方法调用期间创建。如果future与FutureBuilder同时创建,那么每次重建FutureBuilders的父级时,异步任务都将重新启动。
一般的指导原则是假设每个构建方法都可以在每帧调用,并将省略的调用视为优化。
我在https://youtu.be/sqE-J8YJnpg.
如果您想要实时更新,请使用Stream
而不是Future
。
StreamBuilder<QuerySnapshot>( // StreamBuilder
stream:FirebaseFirestore.instance.collection("Posts").where('region', isEqualTo: filterSelected).orderBy('date', descending: true).snapshots(), // snapshots
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot)
{
return ListView.builder(
itemCount: snapshot.data.docs.length,
itemBuilder: (context, index){
DocumentSnapshot Post = snapshot.data.docs[index];
.........)
参考资料:Cloud Firestore Flutter