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?
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));
}
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));
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));
}
}
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, Widget
s 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.