web-dev-qa-db-fra.com

Flutter: Exécuter la méthode sur la construction du widget terminée

Je voudrais pouvoir exécuter des fonctions une fois qu'un widget a fini de créer/charger, mais je ne sais pas comment. Mon cas d'utilisation actuel est de vérifier si un utilisateur est authentifié et, dans le cas contraire, de le rediriger vers une vue de connexion. Je ne veux pas vérifier avant et pousser soit la vue de connexion ou la vue principale, cela doit se produire après le chargement de la vue principale. Y at-il quelque chose que je peux utiliser pour faire cela?

31
KingLagalot

Vous pourriez utiliser

https://github.com/slightfoot/flutter_after_layout

qui exécute une fonction seulement une fois après la mise en page. Ou simplement regarder son implémentation et l'ajouter à votre code :-)

Qui est fondamentalement

  void initState() {
    super.initState();
    WidgetsBinding.instance
        .addPostFrameCallback((_) => yourFunction(context));
  }
66
Thomas

PDATE: Flutter v1.8.4

Les deux codes mentionnés fonctionnent maintenant:

Fonctionnel:

WidgetsBinding.instance
        .addPostFrameCallback((_) => yourFunction(context));

Travailler

import 'package:flutter/scheduler.Dart';

SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));
29
anmol.majhail

Flutter 1.2 - Dart 2.2

Selon les directives officielles et sources si vous voulez être certain que la dernière image de votre mise en page a été dessinée, vous pouvez écrire par exemple:

import 'package:flutter/scheduler.Dart';

void initState() {
   super.initState();
   if (SchedulerBinding.instance.schedulerPhase == SchedulerPhase.persistentCallbacks) {
        SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));
   }
}
4

Si vous recherchez l'équivalent de componentDidMount de ReactNative, Flutter l'a. Ce n'est pas si simple, mais ça fonctionne de la même façon. Dans Flutter, Widgets ne gèrent pas directement leurs événements. Au lieu de cela, ils utilisent leur objet State pour le faire.

class MyWidget extends StatefulWidget{

  @override
  State<StatefulWidget> createState() => MyState(this);

  Widget build(BuildContext context){...} //build layout here

  void onLoad(BuildContext context){...} //callback when layout build done
}

class MyState extends State<MyWidget>{

  MyWidget widget;

  MyState(this.widget);

  @override
  Widget build(BuildContext context) => widget.build(context);

  @override
  void initState() => widget.onLoad(context);
}

State.initState sera immédiatement appelé une fois que l'écran aura terminé le rendu de la mise en page. Et ne sera plus jamais appelé, même lors d’un rechargement à chaud, si vous êtes en mode débogage, jusqu’à ce qu’il ait explicitement pris le temps de le faire.

4
jerinho