Concepts de base de la Navigation
Si vous avez suivi ce tutoriel depuis le début, vous devriez avoir aperçu ce code :
_navigationService.replaceWith(Routes.homeView);
La navigation fait partie des Services Stacked, un groupe de services au sein de Stacked qui vous aide à effectuer certaines tâches dans votre code. Pour en savoir plus sur ce qu'est un service, lisez ceci.
Les services actuellement inclus sont :
- [Navigation Service][#navigation]
- Dialog Service
- Bottom Sheet Service
- Snackbar Service
... et bientôt d'autres à venir. Dans ce document, nous aborderons la navigation.
Navigation
Le NavigationService
est ce qui vous permet de naviguer au sein d'une application Stacked. Il est accessible dans tous les ViewModels
via le locator, où vous pouvez effectuer vos tâches de navigation.
Vos Views seront automatiquement ajoutées à app/app.dart
dans la section ci-dessous, lorsque vous utilisez la CLI pour créer une View. Cela générera les méthodes de navigation que vous pourrez utiliser :
(routes: [
MaterialRoute(page: StartupView),
MaterialRoute(page: HomeView),
MaterialRoute(page: CounterView),
// @stacked-route
])
class App {}
Effectuer une navigation
Il existe différents types de navigation. Explorons-les tous pour comprendre ce qu'ils font.
Naviguer vers une View
Il s'agit de la navigation la plus courante. Cela ajoutera la View
vers laquelle vous naviguez à la pile de navigation. Nous le faisons en utilisant la fonction navigateTo[NomDeLaView] :
_navigationService.navigateToHomeView();
Naviguer vers une View avec des paramètres
Dans votre application Stacked générée au début, ouvrez home_view.dart
où nous transmettrons une valeur à travers son constructeur :
class HomeView extends StackedView<HomeViewModel> {
final int startingIndex;
const HomeView({Key? key, required this.startingIndex}) : super(key: key);
...
}
Maintenant, exécutez stacked generate
. Vous remarquerez que l'appel navigateToHomeView
ci-dessus aura désormais une erreur de compilation. Comme startingIndex
est requis, vous devrez obligatoirement transmettre la valeur de startingIndex
lors de la navigation vers HomeView :
_navigationService.navigateToHomeView(startingIndex: 0);
Remplacer par une View
Une autre méthode de navigation populaire consiste à remplacer la View actuelle à l'écran par une nouvelle, au lieu de l'ajouter en haut de la pile de navigation. Cela se fait en utilisant la fonction replaceWith[NomDeLaView]
et fonctionne de manière similaire à ce qui précède :
_navigationService.replaceWithHomeView(startingIndex: 0);
Navigation Retour (Back)
Lorsque vous souhaitez revenir d'une View à la Vue précédente, vous pouvez utiliser la fonction back
:
_navigationService.back();
Transmettre des données à la View précédente
La fonction back
prend également un paramètre result
. Cela transmettra le résultat à la fonction appelante. Tous les appels de navigation renvoient un Future
afin qu'ils puissent tous être attendus :
final result = await _navigationService.replaceWithHomeView(startingIndex: 0);
print('Returned result: $result');
Ainsi, avec le code ci-dessus, lorsque vous appelez :
_navigationService.back(result: 'From back call');
Il affichera Returned result: From back call
. Le résultat est de type dynamic
, vous pouvez donc renvoyer n'importe quel objet : votre propre classe ou des types built-in. En plus des bases ci-dessus, il existe quelques fonctions supplémentaires qui facilitent certaines tâches de navigation :
- clearStackAndShow: Cela effacera l'ensemble de la pile de navigation puis affichera la
HomeView
:
_navigationService.clearStackAndShow(Routes.homeView);
Des documents et tutoriels plus avancés sur la navigation arriveront bientôt.
Transitions custom
Dans Flutter, les routes MaterialRoute
et CupertinoRoute
ont des transitions pré-définies. Pour définir votre propre transition, vous devez utiliser une CustomRoute
. Stacked vous permet de le faire. La transition peut être fournie à l'application StackedApp
pour garantir que toute navigation vers cette vue utilise la transition fournie, ou elle peut être fournie lors de la navigation vers la View.
Définition au niveau de l'app
Dans votre fichier app.dart
lorsque vous définissez la route, utilisez une CustomRoute
plutôt qu'une MaterialRoute
or CupertinoRoute
.
(routes: [
MaterialRoute(page: StartupView),
MaterialRoute(page: HomeView),
CustomRoute(page: CounterView), // <== Custom Route
// @stacked-route
])
class App {}
La route personnalisée vous permet de fournir une propriété de transition. Cela DOIT être une fonction de construction statique. Stacked est livré avec des transitions prédéfinies que vous pouvez utiliser. Nous couvrons les transitions de base comme fadeIn
, zoomIn
, slideLeft
, slideRight
et bien d'autres sous la classe TransitionsBuilders
. Utilisons le fadeIn
pour notre exemple.
(routes: [
...
CustomRoute(
page: CounterView,
transitionsBuilder: TransitionsBuilders.fadeIn,
),
// @stacked-route
])
class App {}
Maintenant, exécutez stacked generate
et lorsque vous naviguerez vers cette vue, vous la verrez apparaître en fade-in. Si vous ne voulez aucune transition (ce qui est généralement préféré sur le web), supprimez le constructeur de transition et gardez uniquement la CustomRoute
.
Définition au moment de la navigation
En plus de fournir la transition au niveau de l'application, vous pouvez également fournir la transition lors de la navigation. Pour ce faire, votre route doit toujours être une CustomRoute
pour permettre à Stacked de construire la transition que vous souhaitez. Cela ne nécessite pas de régénération du code pour fonctionner, si le code a déjà été généré en tant que CustomRoute
.
await _navigationService.navigateTo(
Routes.secondView,
transition: TransitionsBuilders.fadeIn,
);
Construisez votre propre transition
Construire une transition est assez simple. Vous créez une classe centralisant vos Transitions
et à l'intérieur, vous créez une fonction statique avec la signature suivante : Widget Function(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child)
. Cette fonction sera appelée au moment de la transition. Voici un exemple de transition en utilisant le package Animations
.
import 'package:animations/animations.dart';
import 'package:flutter/material.dart';
class CustomRouteTransition {
static Widget sharedAxis(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation, Widget child) {
// À cet enderoit, vous pouvez utiliser n'importe quelle classe de Transition existante dans Flutter
return SharedAxisTransition(
animation: animation,
secondaryAnimation: secondaryAnimation,
transitionType: SharedAxisTransitionType.scaled,
child: child,
);
}
}
Cela peut être utilisé de la même manière que les transitions fournies avec Stacked dans la classe TransitionBuilders
.
// Dans app.dart
CustomRoute(
page: CounterView,
transitionsBuilder: CustomRouteTransition.sharedAxis,
),
// À la navigation
await _navigationService.navigateTo(
Routes.secondView,
transition: transitionsBuilder: CustomRouteTransition.sharedAxis,
);
Nous sommes prêts pour le Web 🚀
Maitrisez Flutter pour le web avec le cours Flutter Web officiel.