web-dev-qa-db-fra.com

Comment vérifier quel est l'itinéraire actuel?

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!

10
Marko

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);
}
6
Rémi Rousselet

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(),
  },
)
2
jurrdb

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

0
Vinoth M

Utilisez le code suivant pour vérifier si la route est top top ...

 Route route = MaterialPageRoute(builder: (context) => WidgetName());
 if(route.isCurrent){
 }
0
Dhiraj Sharma