133 votes

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

Je suis à la recherche d'un moyen de charger des données asynchrones sur la méthode InitState, j'ai besoin de certaines données avant l'exécution de la méthode de construction. J'utilise un code GoogleAuth, et je dois exécuter la méthode de construction jusqu'à ce qu'un Stream soit exécuté.

Ma méthode initState est :

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

J'apprécierai tout commentaire.

4 votes

StreamBuilder est la solution correcte

0 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 à utiliser setState() à l'intérieur ?

1voto

Aathi Points 395
@override
  void initState() {
    super.initState();
     _userStorage.getCurrentUser().then((user) {
      setState(() {
        if (user.isAuthenticated) {
          Timer.run(() {
            redirectTo();
          });
        }
      });
    });
  }

 void redirectTo() {
    Navigator.push(context,
        MaterialPageRoute(builder: (BuildContext context) => new ShopOrders()));
  }

1voto

Mark Parris Points 1

Comme le chargement ou l'attente de l'état initial est un événement (généralement) ponctuel, FutureBuilder semble être une bonne option, car il ne bloque qu'une seule fois sur une méthode asynchrone ; la méthode asynchrone pouvant être le chargement de la configuration json, la connexion, etc. Il y a un post à ce sujet [ici] dans stack.( Flutter StreamBuilder vs FutureBuilder )

0voto

Que pensez-vous de ça ?

@override
void initState() {
 //you are not allowed to add async modifier to initState
 Future.delayed(Duration.zero,() async {
  //your async 'await' codes goes here
 });
 super.initState();
}

0voto

Saad Ahmed Points 71

J'ai utilisé un timer dans initState.

Timer timer;

@override
void initState() {
  super.initState();
  timer = new Timer.periodic(new Duration(seconds: 1), (Timer timer) async {
      await this.getUserVerificationInfo();
  });
}

@override
void dispose() {
    super.dispose();
    timer.cancel();
}

getUserVerificationInfo() async {
   await someAsyncFunc();
   timer.cancle();
}

-1voto

AKASH MATHWANI Points 427

Doux et court :

(() async {
      await your_method();
      setState(() {....anything here});
 })();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X