我想知道何时应该使用将来的构建器。例如,如果我要发出http请求并在列表视图中显示结果,那么一旦打开视图,我是否必须使用future生成器或仅构建ListViewBuilder类似的生成器:
ListViewBuilder
new ListView.builder( itemCount: _features.length, itemBuilder: (BuildContext context, int position) { ...stuff here... }
此外,如果我不想构建列表视图,而是想要构建一些更复杂的东西(例如圆形图表),是否应该使用Future Builder?
希望它足够清楚!
FutureBuilder 删除 一些 样板代码 。
FutureBuilder
假设您要fetch data from backend启动页面并显示加载程序,直到数据到来。
fetch data from backend
ListBuilder的任务:
dataFromBackend
isLoadingFlag
isLoadingFlag = true
loader
backend
isLoadingFlag = false
setState
if-else
widget
true
data
error message
FutureBuilder的任务:
future
connectionState
message
loading
active(streams)
done
data(snapshot.hasError)
FutureBuilder的优点
two flags
例:
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);
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); }); } });
因此,这FutureBuilder是我们通常所做的工作的包装/样板。因此,不应有任何性能影响。