我想知道何时应该使用将来的构建器。例如,如果我要发出http请求并在列表视图中显示结果,则一旦打开视图,我是否必须使用future生成器或仅构建ListViewBuilder
类似对象:
new ListView.builder(
itemCount: _features.length,
itemBuilder: (BuildContext context, int position) {
...stuff here...
}
此外,如果我不想构建列表视图,而是想要构建一些更复杂的东西(例如圆形图表),是否应该使用Future Builder?
希望它足够清楚!
FutureBuilder
删除一些样板代码。
假设您要fetch data from backend
启动页面并显示加载程序,直到数据到来。
ListBuilder的任务:
dataFromBackend
2。isLoadingFlag
isLoadingFlag = true
并根据显示loader
。backend
并进行设置isLoadingFlag = false
(setState
显然在内部)if-else
在widget
创作。如果isLoadingFlag
是true
,则显示loader
其他显示data
。如果失败,请显示error message
。FutureBuilder的任务:
future
Future Builder中提供异步任务connectionState
,秀message
(loading
,active(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只是StatefulWidget
其state
变量为_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] 删除。
我来说两句