【问题标题】:Using Navigator.popUntil and route without fixed name使用 Navigator.popUntil 和没有固定名称的路由
【发布时间】:2018-07-26 09:35:16
【问题描述】:

是否可以将 Navigator.popUntil 与没有固定名称的路由一起使用?

我通过以下方式创建了一条路线:

  final _key_homepage = new GlobalKey<HomePageState>();

    Navigator.pushReplacement(context, new MaterialPageRoute(
      builder: (BuildContext context) =>  new HomePage(key: _key_homepage, somevariable1: 'some value', somevariable2: 'some value 2'),
    ));

现在,当我在任何屏幕上收到推送通知并显示弹出消息时,其中一个按钮应该指向上面列出的路线。路线已经创建,必须“弹出”到。怎么做?

使用命名路由,可以这样做:

 new FlatButton(
    child: new Text('Go to homepage'),
    onPressed: () {
      Navigator.popUntil(context, ModalRoute.withName('/homepage'));  

     //how to do the same without ModalRoute.withName('/homepage')

    },
)

“关键”和所需路线的上下文都可用。然而,重新创建路由感觉不是一个好的解决方案,因为原始路由创建包含一些变量(somevariable1、somevariable2 等)。

有什么方法可以做到这一点?

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    你应该在推送你的路由时添加一个设置;自定义名称

    Navigator.pushReplacement(
      context,
      MaterialPageRoute(
        settings: RouteSettings(name: "Foo"),
        builder: ...,
      ),
    );
    

    然后你可以像使用命名路由一样使用popUntil

    Navigator.popUntil(context, ModalRoute.withName("Foo"))
    

    【讨论】:

    • 断言失败:第 48 行 pos 15: 'builder != null': is not true.
    • @user9139407 你必须将 builder 属性传递给 MaterialPageRoute(...)
    【解决方案2】:

    如果你不使用命名路由或者我们想让导航器先激活,你可以使用

    Navigator.of(context).popUntil((route) => route.isFirst)
    

    【讨论】:

    • 这很完美,它显示了初始主页(如果你的应用程序是这样构建的)
    • 谢谢,这正是我要找的
    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2015-07-07
    • 2014-09-11
    • 2016-10-15
    相关资源
    最近更新 更多