1 flutter
我有一个获取请求,我将它作为未来传递给 FutureBuilder -
FutureBuilder(
future: gettask(),
builder: (context, snapshot){
if(snapshot.hasData){
// Stopwatch stopwatchbefore = new Stopwatch()..start();
// print('futurebuilder executed in ${stopwatchbefore.elapsed}');
return SingleChildScrollView(child: listViewWidget(snapshot.data));
}else{
return Center(child: CircularProgressIndicator());
}
},
)
Run Code Online (Sandbox Code Playgroud)
然而, gettask() 方法似乎在重复获取事件。我尝试使用https://pub.dev/packages/memoize和https://api.flutter.dev/flutter/package-async_async/AsyncMemoizer-class.html但我认为它们已被弃用,因为它说 AsyncMemoizer 未定义(没有可用的导入选项)。
我也试过https://github.com/flutter/flutter/issues/11426#issuecomment-414047398但我想探索一个类似于 memoizer 的选项。
有没有其他方法可以只获取一次数据(类似于 memoizer)?
使用StatefulWidget,然后在 内部创建一个Future变量(如_getTaskAsync)State。
分配gettask()给initState.
然后使用该变量作为参数FutureBuilder(如future: _getTaskAsync)
代码:
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
Future _getTaskAsync;
...
@override
void initState() {
_getTaskAsync = gettask();
super.initState();
}
...
FutureBuilder(
future: _getTaskAsync,
builder: (context, snapshot) {
if (snapshot.hasData) {
//Stopwatch stopwatchbefore = new Stopwatch()..start();
//print('futurebuilder executed in ${stopwatchbefore.elapsed}');
return SingleChildScrollView(child: listViewWidget(snapshot.data));
} else {
return Center(child: CircularProgressIndicator());
}
},
);
Run Code Online (Sandbox Code Playgroud)
参考文档
| 归档时间: |
|
| 查看次数: |
1502 次 |
| 最近记录: |