使用 FutureBuilder 时如何只获取一次数据?

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/memoizehttps://api.flutter.dev/flutter/package-async_async/AsyncMemoizer-class.html但我认为它们已被弃用,因为它说 AsyncMemoizer 未定义(没有可用的导入选项)。

我也试过https://github.com/flutter/flutter/issues/11426#issuecomment-414047398但我想探索一个类似于 memoizer 的选项。

有没有其他方法可以只获取一次数据(类似于 memoizer)?

Cra*_*Cat 5

使用StatefulWidget,然后在 内部创建一个Future变量(如_getTaskAsyncState

分配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)

参考文档