【问题标题】:How to cache Future in FutureBuilder's Future.wait function to not rebuild everytime state changes如何在 FutureBuilder Future.wait 函数中缓存 Future 以在每次状态更改时不重建
【发布时间】:2021-11-09 10:05:03
【问题描述】:

我想使用多个 Future,所以我在 FutureBuilder 中实现了 Future.wait 功能。

但只要页面状态发生变化,它就会不断重建。如何在 Future.wait 中缓存期货?

代码如下:

GetBuilder<OrdersMainController>(builder: (controller) {
            return FutureBuilder(
                future: Future.wait([controller.ordersFuture.value]),// lets me use multiple futures
                builder: (context, snapshot) {
                  switch (snapshot.connectionState) {
                    case ConnectionState.active:
                    case ConnectionState.waiting:
                    case ConnectionState.done:
                      if (snapshot.hasError) {
                        return SizedBox(
                            width: double.infinity,
                            height: 600,
                            child: Center(
                                child: Text(snapshot.error.toString(),
                                    style:
                                        Theme.of(context).textTheme.caption!)));
                      }
                      controller.ordersData.value = (snapshot.data! as List)[0];
                      final DataTableSource _data =
                          OrdersMainSource(controller.ordersData.value.data!);
                      return ...
                    default:
                      return ...;
                  }
                });
          })

【问题讨论】:

  • 检查 AsyncMemoizer - 官方文档说:“一个只运行一次异步函数并缓存其结果的类。”
  • 您也可以将Future 保存到成员变量中。
  • 尝试将id 放入您可以指定id:"someText" 的GetBuilder 中,update(["someText"]) 中给出的相同文本将触发重建。如果 update() 没有 id 它不会重建。

标签: flutter dart flutter-getx


【解决方案1】:

不要在每次构建时调用 Future.wait(),而是使用 StatefulWidget 并将计算缓存在其状态中(请注意,状态对象在重建后仍然存在)。

class _MyWidgetState extends State<MyWidget> {
late final lotsOfData=Future.wait([controller.ordersFuture.value])
 @override
  Widget build(BuildContext context) {
.....
 return FutureBuilder(
                future: lotsOfData,


通过将lotsOfData 声明为最后一个变量 State 对象中,您实际上正在缓存它。通过延迟声明,您不会急切地启动 Futures,而是在第一次访问时。

【讨论】:

    猜你喜欢
    • 2021-07-16
    • 1970-01-01
    • 2021-11-03
    • 2023-02-22
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    相关资源
    最近更新 更多