Je me demandais quand utiliser le futur constructeur. Par exemple, si je veux faire une requête http et afficher les résultats dans une vue de liste, dès que vous ouvrez la vue, dois-je utiliser le futur générateur ou simplement construire un ListViewBuilder
comme:
new ListView.builder(
itemCount: _features.length,
itemBuilder: (BuildContext context, int position) {
...stuff here...
}
De plus, si je ne veux pas construire une vue de liste mais des choses plus complexes comme des graphiques circulaires, devrais-je avoir à utiliser le futur constructeur?
J'espère que c'est assez clair!
FutureBuilder
supprime certains des codes passe-partout.
Disons que vous voulez fetch data from backend
Au lancement de la page et montrer le chargeur jusqu'à ce que les données arrivent.
Tâches pour ListBuilder:
dataFromBackend
2 .isLoadingFlag
isLoadingFlag = true
Et en fonction de quel spectacle loader
.backend
et définissez isLoadingFlag = false
(Dans setState
évidemment)if-else
Dans la création de widget
. Si isLoadingFlag
est true
, affichez loader
sinon affichez data
. En cas d'échec, affichez error message
.Tâches pour FutureBuilder:
future
de Future BuilderconnectionState
, afficher message
(loading
, active(streams)
, done
)data(snapshot.hasError)
afficher la vueAvantages de FutureBuilder
two flags
et pas de setState
FutureBuilder
se chargera de mettre à jour la vue à l'arrivée des données)Exemple:
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}');
}
},
)
Impact sur les performances:
Je viens de regarder dans le code FutureBuilder
pour comprendre l'impact performance de l'utilisation de ceci.
StatefulWidget
dont la variable state
est _snapshot
_snapshot = new AsyncSnapshot<T>.withData(ConnectionState.none, widget.initialData);
Il s'abonne à future
que nous envoyons dans le constructeur et met à jour le state
en fonction de cela.
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);
});
}
});
Ainsi, le FutureBuilder
est un wrapper/passe-partout de ce que nous faisons généralement. Il ne devrait donc pas y avoir d'impact sur les performances.