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

2023-12-12

我有一个获取请求,我将其作为未来传递给 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());
        }
    },
)

然而, gettask() 方法似乎重复获取事件。我尝试使用https://pub.dev/packages/memoize and https://api.flutter.dev/flutter/package-async_async/AsyncMemoizer-class.html但我认为它们已被弃用,因为它说 AsyncMemoizer 未定义(没有可用的导入选项)。

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

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


Use StatefulWidget,然后创建一个Future变量(如_getTaskAsync) 里面State.

Assign gettask()到未来的变量initState.

然后使用该变量作为参数FutureBuilder(like future: _getTaskAsync)

Code:

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());
        }
      },
    );

请参阅document

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用FutureBuilder时如何只获取一次数据? 的相关文章