Je souhaite naviguer vers différents itinéraires à l'aide d'un tiroir, bien que je ne veuille pas ouvrir une nouvelle instance d'un itinéraire à chaque fois que je tape dessus si je suis déjà sur cet itinéraire. Je préférerais dans ce cas qu'un nouvel itinéraire soit pas ouvert. C'est mon code jusqu'à présent:
Widget build(BuildContext context){
return new Drawer(
child:
new ListView(
children: <Widget>[
new ListTile(
title: new Text("NewRoute"),
onTap: () {
Navigator.of(context).pop;
Navigator.of(context).pushNamed('/NewRoute');
}
)
)
)
}
Je veux utiliser une déclaration conditionnelle pour vérifier si nous sommes sur une certaine route. Je sais qu'il existe un moyen de vérifier quelle route nous suivons actuellement avec la classe isCurrent of the Route
https://docs.flutter.io/flutter/widgets/Route/isCurrent.html
mais je ne suis pas sûr de savoir comment le mettre en œuvre.
Merci d'avance!
Navigator
n'expose pas l'itinéraire actuel.
Ce que vous pouvez faire à la place est d'utiliser Navigator.popUntil(callback)
en tant que popUtil
passer au callback la Route
actuelle, qui inclut son nom et son contenu.
final newRouteName = "/NewRoute";
bool isNewRouteSameAsCurrent = false;
Navigator.popUntil(context, (route) {
if (route.settings.name == newRouteName) {
isNewRouteSameAsCurrent = true;
}
return true;
});
if (!isNewRouteSameAsCurrent) {
Navigator.pushNamed(context, newRouteName);
}
La réponse de Rémi m'a vraiment aidé, mais si vous êtes nouveau dans Flutter/Dart comme moi, il faut un certain temps pour comprendre. Voici donc ma version avec quelques vérifications supplémentaires et des documentations explicatives:
/// Navigates through the application. Only replaces the top Route if it is
/// different from the new Route. Always keeps the home page as base of the
/// Navigator stack. New screens are pushed on the Navigator stack. When the
/// user switches between non-home screens, the new screen replaces the old
/// screen. In this way, the stack of screens from the drawer is never higher
/// than 2. Returning to the HomeScreen is done by just popping the current
/// Route.
void _changeRoute(BuildContext context, String newRouteName) {
// Close drawer
Navigator.pop(context);
// Check current screen status
bool currentRouteIsHome = false;
bool currentRouteIsNewRoute = false;
Navigator.popUntil(context, (currentRoute) {
// This is just a way to access currentRoute; the top route in the
// Navigator stack.
if (currentRoute.settings.name == HomeScreen.ROUTE_NAME) {
currentRouteIsHome = true;
}
if (currentRoute.settings.name == newRouteName) {
currentRouteIsNewRoute = true;
}
// Return true so popUntil() pops nothing.
return true;
});
// Switch screen
if (!currentRouteIsNewRoute) {
// Only switch screen if new route is different from current route.
if (currentRouteIsHome) {
// Navigate from home to non-home screen.
Navigator.pushNamed(context, newRouteName);
} else {
if (newRouteName == HomeScreen.ROUTE_NAME) {
// Navigate from non-home screen to home.
Navigator.pop(context);
} else {
// Navigate from non-home screen to non-home screen.
Navigator.popAndPushNamed(context, newRouteName);
}
}
}
}
Notez que cette implémentation avec pushNamed
et popAndPushNamed
nécessite que vous définissiez des noms Route
dans votre niveau supérieur MaterialApp
dans l'argument routes:
, comme suit:
new MaterialApp(
routes: <String, WidgetBuilder>{
// define the routes
YOUR_SCREEN_ROUTE_NAME: (BuildContext context) => new YourScreen(),
},
)
J'utilise ce code.
*Route route = MaterialPageRoute(builder: (context) => Myinternet());
print(route.isCurrent);
if(route.isCurrent){
}*
Sortie:
Affiche Toujours faux Impossible de trouver la page actuelle
Utilisez le code suivant pour vérifier si la route est top top ...
Route route = MaterialPageRoute(builder: (context) => WidgetName());
if(route.isCurrent){
}