使用AsyncMemoizer。
参考:
https://medium.com/flutterworld/why-future-builder-called-multiple-times-9efeeaf38ba2
Dart async package have class AsyncMemoizer which resolve this issue internally by using the method runOnce.
The inner code inside this method will run exactly ones.
class MemoizerSample extends StatefulWidget {
@override
_MemoizerSampleState createState() => _MemoizerSampleState();
}
class _MemoizerSampleState extends State<MemoizerSample> {
AsyncMemoizer _memoizer;
_fetchData() async {
return this._memoizer.runOnce(() async { // This below code will call only ones. This will return the same data directly without performing any Future task.
await Future.delayed(Duration(seconds: 10));
return 'DATA';
});
}
@override
void initState() {
super.initState();
_memoizer = AsyncMemoizer();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: FutureBuilder(
future: _fetchData(),
builder: (ctx, snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data.toString());
}
return CircularProgressIndicator();
},
),
),
);
}
}