0
votes

Comment vous assurer que la fonction Async est chargée avant la construction de widget?

J'ai un écran avec quelques informations sur l'utilisateur.

Dans mon widget de construction, j'ai ceci: xxx

et j'ai une fonction pour mettre à jour le tableau de bord chacun l'utilisateur de l'utilisateur de temps. xxx

et dans inittstate i appelez cette fonction: xxx

Ceci fonctionne, mais je Obtenez ce $ {this.user.points} est null pendant quelques secondes (je reçois cet écran d'avertissement), puis il est chargé et tout va bien. Je suppose que c'est parce que ma fonction est async ... mais comment puis-je assurer que ce updatedachéboard () est appelé avant le rendu widget () ?


1 commentaires

Regardez futurbuilder . Il s'agit d'un widget de commodité qui vous permet de créer un écran simulé (par exemple un indicateur de progression circulaire centré) jusqu'à ce que l'avenir se termine, lorsque vous construisez à la place de l'écran entier.


4 Réponses :


1
votes

Eh bien, ASYNC signifie que les données peuvent prendre le temps de charger et sont remises à un autre fil à charger. Il peut y avoir plusieurs moyens non bloquants de le faire:

  1. Fournissez une valeur par défaut pour l'objet utilisateur , alors au moment de la fin de la méthode ASYNC, vous affichez des valeurs proxy / défaut et SETState () Assure La nouvelle valeur est affichée lorsqu'elle est chargée.

  2. Cette méthode vous oblige à charger des widgets de manière conditionnelle, c'est-à-dire que la charge widget widget lorsqu'il y a des données à la charge d'un conteneur ()

    Exemple pour la deuxième approche: xxx

    De cette façon, vous n'avez pas besoin d'afficher le widget avant la charge de valeur. L'une des approches fonctionnent et en fonction de votre cas d'utilisation, vous pouvez choisir que vous pouvez appliquer.


2 commentaires

J'ai essayé votre solution mais sans succès :( ... Y a-t-il un moyen de mettre un écran "Chargement ..." jusqu'à ce que tout soit chargé dans la construction?


Ceci est juste un raccourci pour écrire si / sinon. Je pense que vous devriez aller avec la réponse acceptée, c'est la normale.



0
votes

Vous pouvez mettre la fonction juste avant le widget de retour.


1 commentaires

Cela ne fait pas une différence. Le widget va toujours charger avant la fin de la fonction. La réponse de Doc fonctionne très bien.



3
votes

Si vous ne voulez pas utiliser futurbuilder code>, vous pouvez faire quelque chose comme

@override
  void initState() {
    /* whatever */
    done = false;
  }


0 commentaires

0
votes

Vous pouvez faire une variable de chargement comme bool _loading code> puis vous démarrez chargement code> vous async code> fonction que vous pouvez setstate code > de chargement à true, alors setstate code> de de chargement code> sur false lorsque async code> arrête de charger comme celui-ci.

body: _loading
? Center(
   child: CircularProgressIndicator( //Show a Circular Progress indicator
     valueColor: new AlwaysStoppedAnimation<Color>(Colors.cyan),
    ),
  )
:Column(//Show your Dashboard)


0 commentaires