web-dev-qa-db-fra.com

Comment réinitialiser l'itinéraire de base dans mon application Flutter - c'est-à-dire pop tous les itinéraires et le remplacer par un nouveau à l'aide de Navigator

Nouveau chez Flutter, veuillez me pardonner si cela est évident, mais j'ai lu la documentation et essayé un tas d'options de navigateur, mais aucune ne fonctionne comme je le voudrais. Le problème posé: Nous avons une série complexe (enfin, semi-complexe) d'écrans, etc. qui gèrent le processus de connexion/autorisation/enregistrement. Cela peut descendre à 3 ou 4 niveaux sur la pile Route. Tout va bien - pas de soucis.

Le problème survient lorsque nous obtenons un événement de connexion réussi (à partir de plusieurs chemins différents) et que nous voulons accéder à la page "d'accueil". Une fois que nous sommes sur la page d'accueil, cela devrait être la nouvelle "racine" de l'arborescence Route (je suis sûr que ce n'est pas la bonne terminologie - mais je pense que l'idée est solide).

Donc, étant donné que nous pourrions être 1/2/3 ou même 4 niveaux plus bas et que nous voulons "sauter" et remplacer toute la pile (avec tous les événements de transition, s'il vous plaît) par une nouvelle racine de niveau supérieur - quel ensemble ou méthodes magiques de Navigator faire cela proprement?

Mon approche actuelle (horrible) consiste à remettre "pop ()" les niveaux et à faire un appel Navigator.pushReplacementNamed () (ce sont tous des itinéraires nommés ici) mais ce n'est pas une solution générique (il faut savoir exactement combien de niveaux) et pire encore, cela provoque une transition "animation" vers "pop" à l'écran pendant une fraction de seconde pour chaque pop () qui a l'air .. pas très bon.

TIA!

10
sjmcdowall

Navigator expose bien plus que pop. Vous pouvez effectuer des opérations telles que les suivantes:

Navigator.pushNamedAndRemoveUntil(context, '/', (_) => false);

Cela poussera essentiellement une maison et supprimera tous les routes derrière la nouvelle

23
Rémi Rousselet

Essayez ce code:

    Navigator.pushAndRemoveUntil(
                    context,
                    MaterialPageRoute(
                      builder: (BuildContext context) => YourInitialPage(),
                    ),
                    ModalRoute.withName('/'));

Si vous ne voulez pas de transition, vous pouvez remplacer ou étendre la classe MaterialPageRoute

1
diegoveloper