我什么时候应该使用FutureBuilder?

小猴子 :

我想知道何时应该使用将来的构建器。例如,如果我要发出http请求并在列表视图中显示结果,则一旦打开视图,我是否必须使用future生成器或仅构建ListViewBuilder类似对象:

new ListView.builder(
        itemCount: _features.length,
        itemBuilder: (BuildContext context, int position) {
...stuff here...
}

此外,如果我不想构建列表视图,而是想要构建一些更复杂的东西(例如圆形图表),是否应该使用Future Builder?

希望它足够清楚!

Dinesh Balasubramanian:

FutureBuilder 删除一些样板代码

假设您要fetch data from backend启动页面并显示加载程序,直到数据到来。

ListBuilder的任务:

  • 有两个状态变量1. dataFromBackend2。isLoadingFlag
  • 在启动时,设置isLoadingFlag = true并根据显示loader
  • 数据到达后,请根据您的数据来设置数据backend并进行设置isLoadingFlag = falsesetState显然在内部
  • 我们需要有一个if-elsewidget创作。如果isLoadingFlagtrue,则显示loader其他显示data如果失败,请显示error message

FutureBuilder的任务:

  • futureFuture Builder中提供异步任务
  • 基于connectionState,秀messageloadingactive(streams)done
  • 基于data(snapshot.hasError)显示视图

FutureBuilder的优点

  • two flags,不setState
  • 反应式编程(FutureBuilder将负责更新有关数据到达的视图)

例:

    FutureBuilder<String>(
        future: _fetchNetworkCall, // async work
        builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
           switch (snapshot.connectionState) {
             case ConnectionState.waiting: return Text('Loading....');
             default:
               if (snapshot.hasError)
                  return Text('Error: ${snapshot.error}');
               else
              return Text('Result: ${snapshot.data}');
            }
         },
        )

性能影响:

我只是看了一下FutureBuilder代码,以了解使用它性能影响。

  • FutureBuilder只是StatefulWidgetstate变量为_snapshot

  • 初始状态为 _snapshot = AsyncSnapshot<T>.withData(ConnectionState.none, widget.initialData);

  • 订阅future我们要发送的构造函数并在此state基础上进行更新

      widget.future.then<void>((T data) {
          if (_activeCallbackIdentity == callbackIdentity) {
        setState(() {
          _snapshot = AsyncSnapshot<T>.withData(ConnectionState.done, data);
         });
       }
      }, onError: (Object error) {
      if (_activeCallbackIdentity == callbackIdentity) {
        setState(() {
          _snapshot = AsyncSnapshot<T>.withError(ConnectionState.done, error);
        });
       }
      });
    

因此,这FutureBuilder是我们通常所做的工作的包装/样板。因此,不应有任何性能影响。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章