25

I have view with bottom navigation bar, and when you push a navbar item, a new route is pushed into view.

 final navigatorKey = GlobalKey<NavigatorState>();

 @override
  Widget build(BuildContext context) => MaterialApp(
    home: Scaffold(
      key: _scaffoldKey,
      body: _buildBody(context),
      bottomNavigationBar: _buildBottomNavigationBar(context),
    ),
  );

 void routeToView(routeIndex) {
      navigatorKey.currentState.pushNamed(pagesRouteFactories.keys.toList()[routeIndex]);
  }

I would like to prevent same route being pushed on the current view. I want to compare the current route with new route we are trying to push, and ignore pushing the route if it is same.

I want to scroll the view to the top if it is same route we are trying to push

Any ideas.

2 Answers 2

21

NavigatorState doesn't expose an API for getting the path of the current route, and Route doesn't expose an API for determining a route's path either. Routes can be (and often are) anonymous. You can find out if a given Route is on the top of the navigator stack right now using the isCurrent method, but this isn't very convenient for your use case.

https://stackoverflow.com/a/46498543/2554745

This is the closest solution I could think of:

Navigator.of(context).pushNamedAndRemoveUntil(
  "newRouteName",
  (route) => route.isCurrent && route.settings.name == "newRouteName"
      ? false
      : true);

It will pop the current route if name of the route is "newRouteName" and then push new one, else will not pop anything.

Edit: Latest flutter provides ModalRoute.of(context).settings.name to get the name of current route.

6
  • 1
    this should be fine,its just that view has to load again with data. Also we are loosing scrolled position. Should I disable the navigation button once clicks on it, and only enable if the user selects another navigation button?
    – skjagini
    Commented Jan 28, 2019 at 22:26
  • 4
    store the currentRouteName whenever you push new route in a variable. and compare it before pushing. that would be your solution then. Commented Jan 29, 2019 at 1:42
  • @HarshBhikadia can you suggest alternate for the pushAndRemoveUntil as well? Commented Sep 21, 2020 at 9:05
  • @HarshBhikadia i get your point. But, let say if i want to push a route like, Navigator.push(context, MaterialPageRoute(builder: (context)=>TestScreen())); So is there anyway to check if the current rout is equal to the TestScreen() or not? I am not able to figure out this one. Commented Sep 21, 2020 at 9:54
  • When you push TestScreen use the Naivagtor.pushNamed method, pass the name that you want. You can get the name (if set) of the current route as mention in the EDIT Commented Sep 21, 2020 at 10:40
2

This works for me:

    Route route = ModalRoute.of(context);
    final routeName = route?.settings?.name;
    if (routeName != null && routeName != nav) {
      Navigator.of(context).pushNamed(nav);
      print(route.settings.name);
    }

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.