【问题标题】:Flutter Futurebuilder data sorting only update after hot reloadFlutter Futurebuilder 数据排序仅在热重载后更新
【发布时间】:2021-03-20 18:52:18
【问题描述】:

过滤器的变化没有刷新显示数据,我如何要求futurebuilder根据新的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() ,不确定哪个是更好的解决方案以及如何添加到代码中,不胜感激!

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore flutter-futurebuilder


    【解决方案1】:

    不要在 FutureBuilder 的“future:”参数中创建未来。如https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html中所说:

    未来一定是更早获得的,例如在 State.initState、State.didUpdateWidget 或 State.didChangeDependencies 期间。在构造 FutureBuilder 时,不能在 State.build 或 StatelessWidget.build 方法调用期间创建它。如果 Future 与 FutureBuilder 是同时创建的,那么每次 FutureBuilder 的 parent 重建时,异步任务都会重新启动。

    一般准则是假设每个构建方法都可以在每一帧被调用,并将省略的调用视为优化。

    我在https://youtu.be/sqE-J8YJnpg 的简短截屏视频中说明了这一点。

    【讨论】:

    • 啊,这让我走上了解决问题的道路,我正在调用多个异步 foreach 循环来对数据进行排序,但这不适用于期货。必须重新调整以在未来返回数据后对数据进行排序,然后在其上调用 setState 修复未来不显示数据
    【解决方案2】:

    如果您想要实时更新,请使用 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

    【讨论】:

    • 不更新数据内容,只是对现有数据进行排序,例如我有 { {apple,banana, chicken},我想让用户选择水果并只显示 {apply,banana}
    猜你喜欢
    • 2022-01-02
    • 2021-08-21
    • 2021-12-26
    • 2020-02-08
    • 2020-12-18
    • 2021-02-06
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多