0
votes

Futurebuilder sur Flutter Web continue de se déclencher lorsque la taille de la fenêtre change

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!');
              }
            })


2 commentaires

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


3 Réponses :


3
votes

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.


0 commentaires

0
votes

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.


2 commentaires

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



0
votes

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.


0 commentaires