Flutter Futurebuilder数据排序仅在热重新加载后更新



过滤器的更改不刷新显示数据,我如何要求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

最新更新