Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flutter: How to avoid pushing the same route on existing route

Tags:

flutter

dart

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.

like image 600
skjagini Avatar asked Jan 28 '19 21:01

skjagini


People also ask

How do I delete a previous route in flutter?

Push the given route onto the navigator, and then remove all the previous routes until the predicate returns true. The predicate may be applied to the same route more than once if Route. willHandlePopInternally is true. To remove routes until a route with a certain name, use the RoutePredicate returned from ModalRoute.


2 Answers

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.

like image 62
Harsh Bhikadia Avatar answered Sep 17 '22 09:09

Harsh Bhikadia


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);
    }
like image 31
TSR Avatar answered Sep 21 '22 09:09

TSR