flutter - 如何在 FutureBuilder 的 Future.wait 函数中缓存 Future 以在每次状态更改时不重建
问题描述
我想使用多个 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 ...;
}
});
})
解决方案
不要在每次构建时调用你,而是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,
通过在State 对象中声明lotsOfData
为后期最终变量,您实际上是在缓存它。并且通过延迟声明,您不会急切地启动 Futures,而是在第一次访问时。
推荐阅读
- python - 使用 python3.6 和 python3.7 在异步中使用 wait_for 的套接字泄漏
- salesforce - 修改代码以允许特定帐户的差异
- vba - 如何使用vba在大型机中查找文本是否突出显示
- java - maven安装时出现编译错误我该如何解决这个错误
- c++ - 列表的 C++ 重载 [][]
- authentication - 如何配置 IBM MQ v9 以使用 Microsoft AD 进行用户认证
- c# - 如何在c#中读取列表中多个csv文件的内容
- sql - 当数据字段组合与相同和不同列匹配时选择记录
- asp.net-core - 如何让 Wix Heat.exe 保留自定义文件 ID?
- ios - setVisibleMapRect 无法预测地与 edgePadding 一起工作