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, на самом деле работает очень элегантно.