Flutter remove all routes

前端 未结 10 1865
难免孤独
难免孤独 2021-01-30 04:46

I want to develop a logout button that will send me to the log in route and remove all other routes from the Navigator. The documentation doesn\'t seem to explain h

相关标签:
10条回答
  • 2021-01-30 05:13

    In case you want to go back to the particular screen and you don't use named router can use the next approach

    Example:

    Navigator.pushAndRemoveUntil(context,
                      MaterialPageRoute(builder: (BuildContext context) => SingleShowPage()),
                      (Route<dynamic> route) => route is HomePage
                  );
    

    With route is HomePage you check the name of your widget.

    0 讨论(0)
  • 2021-01-30 05:14

    If you are using namedRoutes, you can do this by simply :

    Navigator.pushNamedAndRemoveUntil(context, "/login", (Route<dynamic> route) => false);
    

    Where "/login" is the route you want to push on the route stack.

    Note That :

    This statement removes all the routes in the stack and makes the pushed one the root.

    0 讨论(0)
  • 2021-01-30 05:25

    I dont know why no one mentioned the solution using SchedularBindingInstance,A little late to the party though,I think this would be the right way to do it originally answered here

        SchedulerBinding.instance.addPostFrameCallback((_) async {
                                  Navigator.of(context).pushNamedAndRemoveUntil(
                                      '/login',
                                      (Route<dynamic> route) => false);
                                });
    

    The above code removes all the routes and naviagtes to '/login' this also make sures that all the frames are rendered before navigating to new route by scheduling a callback

    0 讨论(0)
  • 2021-01-30 05:28

    Another alternative is popUntil()

    Navigator.of(context).popUntil(ModalRoute.withName('/root'));
    

    This will pop all routes off until you are back at the named route.

    0 讨论(0)
  • 2021-01-30 05:29

    I was able to accomplish this with the following code:

    Navigator.of(context)
        .pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);
    

    The secret here is using a RoutePredicate that always returns false (Route<dynamic> route) => false. In this situation it removes all of the routes except for the new /login route I pushed.

    0 讨论(0)
  • 2021-01-30 05:29

    i can done with the following code snippet :

     Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
        LoginScreen()), (Route<dynamic> route) => false),
    

    if you want to remove all the route below the pushed route, RoutePredicate always return false, e.g (Route route) => false.

    0 讨论(0)
提交回复
热议问题