Reputation: 4044
I am recursively adding routes to the navigator. There could be 20 views or more. Pop works as advertised, but I would like to pop to index 1 and remove all push history. is there a way to replace this pop command with something like... returntoIndex0...
new ListTile(
title: new RaisedButton(
child: new Text("POP"),
onPressed: () {
var route = new MaterialPageRoute(
builder: (BuildContext context) =>
new NextPage3(value:"hi there from 3"),
);
Navigator.pop(context);
},
),
),
Upvotes: 144
Views: 145403
Reputation: 4447
Example for two pops, using cascade operator:
Navigator.of(context)..pop()..pop();
Upvotes: 1
Reputation: 19
This will pop all the routes until the main default route and push to your destination route.
Navigator.pushNamedAndRemoveUntil(context, "destination_route", ModalRoute.withName('/'));
Upvotes: 1
Reputation: 1475
This always gets me the expected result. And will pop to route of current Navigator stack
Navigator.of(context, rootNavigator: true).pop();
Upvotes: 2
Reputation: 4575
Here Dashboard() is the screen name. So this will pop out all the screens and goto Dashboard() screen.
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (c) => Dashboard()),
(route) => false)
Upvotes: 17
Reputation: 1859
I tried other answers in this post, and somehow they causing the following exception.
To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.
The relevant error-causing widget was
MaterialApp
lib/main.dart:72
When the exception was thrown, this was the stack
#0 Element._debugCheckStateIsActiveForAncestorLookup.<anonymous closure>
package:flutter/…/widgets/framework.dart:3781
#1 Element._debugCheckStateIsActiveForAncestorLookup
package:flutter/…/widgets/framework.dart:3795
#2 Element.dependOnInheritedWidgetOfExactType
package:flutter/…/widgets/framework.dart:3837
#3 Theme.of
package:flutter/…/material/theme.dart:128
#4 XXxxXX.build.<anonymous closure>
package:xxx/widgets/xxx.dart:33
...
════════════════════════════════════════════════════════════════════════════════
The following answer fixed the issue. https://stackoverflow.com/a/52048127/2641128
Navigator.pushNamedAndRemoveUntil(context, '/', (_) => false);
Upvotes: 2
Reputation: 956
You can also do it like this
Navigator.of(context)
.pushNamedAndRemoveUntil('/Destination', ModalRoute.withName('/poptillhere'),arguments: if you have any);
The use case is to go the desired screen and pop the screens in between as you require.
For more info, you can check this Post Explaining other Solutions
Upvotes: 8
Reputation: 3142
In case you know exactly how many pops should be performed:
For example for 2 pops:
count = 0;
Navigator.popUntil(context, (route) {
return count++ == 2;
});
Upvotes: 125
Reputation: 7297
For me I used this when pushing a new page:
widget = MyWidget();
Route route = CupertinoPageRoute(builder: (context) => widget, settings:RouteSettings(name: widget.toStringShort()));
Navigator.push(context, route);
Then to go back to specific page:
Navigator.of(context).popUntil((route) => route.settings.name == "MyWidget");
Upvotes: 31
Reputation: 8025
If you do not use named routes, you can use
Navigator.of(context).popUntil((route) => route.isFirst);
Upvotes: 335
Reputation: 1768
If you are using MaterialPageRoute
to create routes, you can use this command:
Navigator.popUntil(context, ModalRoute.withName(Navigator.defaultRouteName))
Navigator.defaultRouteName
reflects the route that the application was started with. Here is the piece of code that illustrates it in more detail:
child: InkWell(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Image(
image: AssetImage('assets/img/ic_reset.png'),),
Text('Change my surgery details',
style: TextStyle(color: Colors.blue, decoration: TextDecoration.underline),),
],
),
onTap: () =>
Navigator.popUntil(context, ModalRoute.withName(Navigator.defaultRouteName))
),
Hope this helps.
Upvotes: 72
Reputation: 4044
//========================================================
new ListTile(
title: new RaisedButton(
child: new Text("POP until"),
onPressed: () {
var route = new MaterialPageRoute(
builder: (BuildContext context) =>
new NextPage3(value:"hi there from 3"),
);
//Navigator.pop(context, ModalRoute.withName('/'));
Navigator.popUntil(context,ModalRoute.withName('/'));
},
),
),
//========================================================
replace .pop with .popUntil, actually works very elegantly.
Upvotes: 1
Reputation: 53317
Use popUntil
method as mentioned in the docs
Typical usage is as follows:
Navigator.popUntil(context, ModalRoute.withName('/login'));
Upvotes: 26