Flutter Navigation pop to index 1
Я рекурсивно добавляю маршруты в навигаторе. Может быть 20 просмотров или больше. Pop работает так, как рекламируется, но я хотел бы поп индексу 1 и удалить всю историю push. есть способ заменить эту команду pop чем-то вроде... 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);
},
),
),
//================================================ ========
Ответы
Ответ 1
Если вы используете MaterialPageRoute
для создания маршрутов, вы можете использовать эту команду:
Navigator.popUntil(context, ModalRoute.withName(Navigator.defaultRouteName))
Navigator.defaultRouteName
отражает маршрут, с которого было запущено приложение. Вот фрагмент кода, который иллюстрирует его более подробно:
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))
),
Надеюсь это поможет.
Ответ 2
Если вы не используете именованные маршруты, вы можете использовать
Navigator.of(context).popUntil((route) => route.isFirst);
Ответ 3
Используйте метод popUntil
как упомянуто в документации
Типичное использование выглядит следующим образом:
Navigator.popUntil(context, ModalRoute.withName('/login'));
Ответ 4
Для меня я использовал это при нажатии на новую страницу:
widget = MyWidget();
Route route = CupertinoPageRoute(builder: (context) => widget, settings:RouteSettings(name: widget.toStringShort()));
Navigator.push(context, route);
Затем, чтобы вернуться на конкретную страницу:
Navigator.of(context).popUntil((route) => route.settings.name == "MyWidget");
Ответ 5
Если вы точно знаете, сколько попсов следует выполнить:
Например, для 2 всплывающих окон:
count = 0;
Navigator.popUntil(context, (route) {
return count++ == 2;
});
Ответ 6
//========================================================
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('/'));
},
),
),
//========================================================
замените.pop на.popUntil, на самом деле работает очень элегантно.