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