J'expérimente avec Flutter Web et je viens de rencontrer un phénomène intéressant - un phénomène qui a grignoté mon allocation d'appels API gratuits pour un projet parallèle, mais bon ho :)
Lors du changement de taille de la fenêtre, le futur constructeur se déclenche à nouveau et se recharge. Est-ce comme prévu? Si oui, y a-t-il un moyen de l'arrêter?
FutureBuilder(
future: _fetchMarketData(
'BOO.XLON,BBOX.XLON,DGE.XLON,GROW.XLON,GSK.XLON,IBM,IEM.XLON,NIO,ULVR.XLON'),
builder: (context, snapshot) {
print('Building');
if (snapshot.hasData) {
List<MarketData> md = snapshot.data;
List<MarketData> _boo =
md.where((md) => md.symbol == 'BOO.XLON').toList();
List<MarketData> _dge =
md.where((md) => md.symbol == 'DGE.XLON').toList();
List<MarketData> _grow =
md.where((md) => md.symbol == 'GROW.XLON').toList();
List<MarketData> _gsk =
md.where((md) => md.symbol == 'GSK.XLON').toList();
List<MarketData> _iem =
md.where((md) => md.symbol == 'IEM.XLON').toList();
List<MarketData> _tri =
md.where((md) => md.symbol == 'BBOX.XLON').toList();
List<MarketData> _ibm =
md.where((md) => md.symbol == 'IBM').toList();
List<MarketData> _nio =
md.where((md) => md.symbol == 'NIO').toList();
List<MarketData> _ulvr =
md.where((md) => md.symbol == 'ULVR.XLON').toList();
List<MarketData> combinedData = [
_boo[0],
_dge[0],
_grow[0],
_gsk[0],
_tri[0],
_ibm[0],
_iem[0],
_nio[0],
_ulvr[0],
];
return Padding(
padding: const EdgeInsets.all(32.0),
child: ListView.builder(
itemBuilder: (context, index) {
return Text(
'${combinedData[index].symbol} - HIGH ${combinedData[index].high}, LOW ${combinedData[index].low}');
},
itemCount: combinedData.length,
shrinkWrap: true,
),
);
} else if (snapshot.hasError) {
return Text(
'Could not fetch data :-/ ${snapshot.error.toString()}');
} else {
return Text('Fetching!');
}
})
3 Réponses :
Oui, c'est intentionnel ... ou du moins vous l'avez construit de cette façon.
Si tu fais ça:
future: _fetchMarketData()
Ensuite, chaque fois que la fonction de construction est appelée, un nouveau Future est généré.
Ce que vous devez faire est d'avoir une variable de type Future<> que vous définissez une fois , de préférence dans initState , puis donnez cette variable à votre FutureBuilder . De cette façon, même lorsque votre fonction de construction est appelée plusieurs fois, elle a toujours le futur qu'elle attend.
J'ai également rencontré ce problème plus tôt, mais dans la dernière version bêta, ce problème ne semble pas se produire. Assurez-vous que vous êtes à jour vers la dernière version sur la chaîne bêta et réessayez.
Sur quelle version de la bêta êtes-vous? J'utilise Flutter 1.23.0-18.1.pre • canal beta
Utiliser le même @kenwen
En plus de récupérer mon avenir dans initState (), j'ai également fait une récupération conditionnelle dans didUpdateWidget (). Cela a fonctionné pour mon cas.
Avec les informations données, il n'est pas possible de deviner la cause. Pourriez-vous donner un peu plus de détails comme quel est le widget parent de ce
FutureBuilder. Ou si vous pouviez fournir un MRE peut-être dans Dartpad, nous pouvons vérifier. :)En fait, je pose la mauvaise question - apparemment, l'arborescence des widgets se reconstruit lors du redimensionnement de la fenêtre, ce qui incite le futur constructeur à se reconstruire constamment