web-dev-qa-db-fra.com

Existe-t-il un moyen de charger des données asynchrones sur la méthode InitState?

Je cherche un moyen de charger des données asynchrones sur la méthode InitState. J'ai besoin de quelques données avant l'exécution de la méthode de génération. J'utilise un code GoogleAuth et je dois exécuter la méthode de construction jusqu'à ce qu'un Stream s'exécute.

Ma méthode initState est:

 @override
  void initState () {
    super.initState();
    _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account)     {
      setState(() {
        _currentUser = account;
      });
    });
    _googleSignIn.signInSilently();
  }

Je vais apprécier vos commentaires.

15
Joseph Arriaza

Vous pouvez utiliser StreamBuilder pour le faire. Cela exécutera la méthode constructeur chaque fois que les données de flux seront modifiées.

Voici un extrait de code 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, il s'agit initialement d'un tableau vide et affiche le 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 méthode constructeur.

Lorsque l'utilisateur fait défiler l'écran vers le bas, davantage de contenu est récupéré et ajouté au tableau de contenu qui sera à nouveau exécuté constructeur méthode.

Dans votre cas, seul le chargement initial sera requis. Mais cela vous offre la possibilité d’afficher autre chose à l’écran jusqu’à ce que les données soient extraites.

J'espère que c'est utile.

EDIT:

Dans votre cas, je suppose que cela ressemblera à l’illustration 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
            }
        });
8
Thanthu

Vous pouvez créer une méthode async et l'appeler dans votre initState

   @override
    void initState () {
      super.initState();
     _asyncMethod();
    }

    _asyncMethod() async {
     _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account)     {
        setState(() {
          _currentUser = account;
        });
      });
      _googleSignIn.signInSilently();
    }
13
diegoveloper

À partir de maintenant, la notation .then Semble fonctionner:

  // ...
  @override
  initState() {
    super.initState();
    asyncFunction.then((result) {
    print("result: $result");
    setState(() {});
    });
  }
  //...
10
Nae

Vous pouvez définir une valeur booléenne telle que chargé et la définir sur true dans votre fonction d'écoute et obliger votre fonction de génération à renvoyer vos données lorsque chargé est défini sur true, sinon il suffit de lancer un CircularProgressIndicator.

2
Fardeen Khan