J'ai un écran avec quelques informations sur l'utilisateur.
Dans mon widget de construction, j'ai ceci: p> et j'ai une fonction pour mettre à jour le tableau de bord chacun l'utilisateur de l'utilisateur de temps. p> et dans inittstate i appelez cette fonction: p> Ceci fonctionne, mais je Obtenez ce $ {this.user.points} code> est null code> 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 code> ... mais comment puis-je assurer que ce updatedachéboard () code> est appelé avant le rendu widget () code >? p> p>
4 Réponses :
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:
Fournissez une valeur par défaut pour l'objet code> utilisateur code>, alors au moment de la fin de la méthode ASYNC, vous affichez des valeurs proxy / défaut et Cette méthode vous oblige à charger des widgets de manière conditionnelle, c'est-à-dire que la charge Exemple pour la deuxième approche: p> 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. P> p> SETState () CODE> Assure La nouvelle valeur est affichée lorsqu'elle est chargée. P> li>
widget code> widget lorsqu'il y a des données à la charge d'un conteneur () p> p> LI >
ol>
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.
Vous pouvez mettre la fonction juste avant le widget de retour. p>
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.
Si vous ne voulez pas utiliser futurbuilder code>, vous pouvez faire quelque chose comme @override
void initState() {
/* whatever */
done = false;
}
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)
Regardez
futurbuilder code>. 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.