私は将来のビルダーをいつ使うべきか疑問に思っていました。たとえば、httpリクエストを作成してリストビューに結果を表示したい場合、ビューを開くとすぐに、将来のビルダーを使用するか、次のように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
内にあることは明らかです)widget
の作成には_if-else
_が必要です。 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}');
}
},
)
_
パフォーマンスへの影響:
これを使用することによるperformanceの影響を理解するために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);
});
}
});
_
したがって、FutureBuilder
は、私たちが通常行うことのラッパー/ボイラープレートです。したがって、パフォーマンスへの影響はありません。