Flutter Navigation弹出到索引1

Iri*_*ngo 21 dart flutter

我在导航器中递归添加路由.可能有20个或更多视图.Pop按宣传方式工作,但我想弹出索引1,并删除所有推送历史记录.有没有办法用像... returntoIndex0这样的东西替换这个pop命令...

      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);
          },
        ),
      ),
Run Code Online (Sandbox Code Playgroud)

// ================================================ ========

meh*_*afi 82

如果您确切知道应该执行多少次流行音乐:

例如对于 2 个流行音乐:

count = 0;
Navigator.popUntil(context, (route) {
    return count++ == 2;
});
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,这是我一直在为我的应用程序寻找的解决方案。 (4认同)
  • 在我的例子中效果很好,我没有使用命名路由! (4认同)
  • 略有变化,因为至少在我们的应用程序中很难跟踪弹出次数。我使用过: `Navigator.popUntil(context, (route) => route.isFirst);` 它工作得很好。 (2认同)

mil*_*oss 34

如果您使用MaterialPageRoute创建路由,则可以使用此命令:

Navigator.popUntil(context, ModalRoute.withName(Navigator.defaultRouteName))
Run Code Online (Sandbox Code Playgroud)

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))
        ),
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Edw*_*Liu 34

如果不使用命名路由,则可以使用

Navigator.of(context).popUntil((route) => route.isFirst);
Run Code Online (Sandbox Code Playgroud)

  • 有人可以解释一下 `popUntil((route) =&gt; route.isFirst)` 会做什么吗?正如我用来将所有后退堆栈弹出到主页小部件一样,但它也会从后退堆栈中弹出主页小部件。 (4认同)
  • 由于某种原因,当使用“.push.then()”时,当我使用“.popUntil((route) =&gt; route.isFirst;)”时,它不会解析“.then”。 (2认同)

dav*_*d72 25

对我来说,我在推送新页面时使用了这个:

widget = MyWidget();
Route route = CupertinoPageRoute(builder: (context) => widget, settings:RouteSettings(name: widget.toStringShort()));
Navigator.push(context, route);
Run Code Online (Sandbox Code Playgroud)

然后返回特定页面:

Navigator.of(context).popUntil((route) => route.settings.name == "MyWidget");
Run Code Online (Sandbox Code Playgroud)


Muh*_*fay 9

这里 Dashboard() 是屏幕名称。所以这将弹出所有屏幕并转到 Dashboard() 屏幕。

Navigator.of(context).pushAndRemoveUntil(
                  MaterialPageRoute(builder: (c) => Dashboard()),
                  (route) => false)
Run Code Online (Sandbox Code Playgroud)


azi*_*iza 8

使用popUntil文档中提到的方法

典型用法如下:

Navigator.popUntil(context, ModalRoute.withName('/login'));


小智 7

你也可以这样做

Navigator.of(context)
            .pushNamedAndRemoveUntil('/Destination', ModalRoute.withName('/poptillhere'),arguments: if you have any);
Run Code Online (Sandbox Code Playgroud)

用例是转到所需的屏幕并根据需要弹出屏幕。

有关更多信息,您可以查看这篇解释其他解决方案的帖子