Méthode 1 : Vous pouvez utiliser StreamBuilder pour le faire. Cela permettra d'exécuter le constructeur chaque fois que les données dans flux changements.
Vous trouverez ci-dessous un extrait de code tiré d'un de mes exemples de projets :
StreamBuilder<List<Content>> _getContentsList(BuildContext context) {
final BlocProvider blocProvider = BlocProvider.of(context);
int page = 1;
return StreamBuilder<List<Content>>(
stream: blocProvider.contentBloc.contents,
initialData: [],
builder: (context, snapshot) {
if (snapshot.data.isNotEmpty) {
return ListView.builder(itemBuilder: (context, index) {
if (index < snapshot.data.length) {
return ContentBox(content: snapshot.data.elementAt(index));
} else if (index / 5 == page) {
page++;
blocProvider.contentBloc.index.add(index);
}
});
} else {
return Center(
child: CircularProgressIndicator(),
);
}
});
}
Dans le code ci-dessus StreamBuilder écoute tout changement de contenu, initialement il s'agit d'un tableau vide et affiche l'icône CircularProgressIndicator . Une fois que j'ai fait l'appel API, les données récupérées sont ajoutées au tableau de contenu, qui exécutera la fonction de l'API. constructeur méthode.
Lorsque l'utilisateur fait défiler la page vers le bas, d'autres contenus sont récupérés et ajoutés au tableau des contenus, qui sera à nouveau exécuté. constructeur méthode.
Dans votre cas, seul le chargement initial sera nécessaire. Mais cela vous donne la possibilité d'afficher autre chose à l'écran jusqu'à ce que les données soient récupérées.
J'espère que cela vous sera utile.
EDIT :
Dans votre cas, je suppose que cela ressemblera à ce qui est indiqué ci-dessous :
StreamBuilder<List<Content>>(
stream: account, // stream data to listen for change
builder: (context, snapshot) {
if(account != null) {
return _googleSignIn.signInSilently();
} else {
// show loader or animation
}
});
Méthode 2 : Une autre méthode consisterait à créer un async
et l'appeler à partir de votre initState()
comme indiqué ci-dessous :
@override
void initState() {
super.initState();
asyncMethod();
}
void asyncMethod() async {
await asyncCall1();
await asyncCall2();
// ....
}
4 votes
StreamBuilder
est la solution correcte0 votes
Ce code est absolument parfait tel quel ?
1 votes
Depuis
initState()
n'est appelé qu'une seule fois, y a-t-il un intérêt à utilisersetState()
à l'intérieur ?0 votes
Pensez également à FutyureBuilder, car il bloque une fois sur l'attente d'une méthode asynchrone ; alors que le modèle de construction de flux est une séquence continue d'événements non résolus.