我想知道何时应该使用未来的构建器。例如,如果我想创建一个http请求并在列表视图中显示结果,那么只要打开视图,我是否必须使用future构建器或者只需构建一个ListViewBuilder
:
new ListView.builder(
itemCount: _features.length,
itemBuilder: (BuildContext context, int position) {
...stuff here...
}
此外,如果我不想构建列表视图但是想要一些更复杂的东西,比如圆形图表,我是否应该使用未来的构建器?
希望它足够清楚!
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
中提供异步任务connectionState
,展示message
(loading
,active(streams)
,done
)data(snapshot.hasError)
显示视图FutureBuilder的优点
two flags
和没有setState
FutureBuilder
将负责更新数据到达的视图)例:
new FutureBuilder<String>(
future: _fetchNetworkCall, // async work
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting: return new Text('Loading....');
default:
if (snapshot.hasError)
return new Text('Error: ${snapshot.error}');
else
return new Text('Result: ${snapshot.data}');
}
},
)
绩效影响:
我只是查看了FutureBuilder
代码,以了解使用它的性能影响。
StatefulWidget
,其state
变量是_snapshot
_snapshot = new AsyncSnapshot<T>.withData(ConnectionState.none, widget.initialData);
,我们在构造函数中发送并基于此更新future
。
state
因此,widget.future.then<void>((T data) {
if (_activeCallbackIdentity == callbackIdentity) {
setState(() {
_snapshot = new AsyncSnapshot<T>.withData(ConnectionState.done, data);
});
}
}, onError: (Object error) {
if (_activeCallbackIdentity == callbackIdentity) {
setState(() {
_snapshot = new AsyncSnapshot<T>.withError(ConnectionState.done, error);
});
}
});
是我们通常所做的包装/样板。所以不应该有任何性能影响。