Flutter - 导航到新屏幕,并清除所有以前的屏幕

问题描述 投票:0回答:7

我用了

Navigator.push
多达6个屏幕才到达付款页面。付款后,我想推送到“付款成功”页面,然后删除所有先前的屏幕,即使用后退按钮将返回到第一个屏幕。

注意:我已经尝试过

pushReplacementNamed
但不起作用。

android dart flutter
7个回答
88
投票

我想通了。这是

Navigator.pushAndRemoveUntil
函数。我必须将
PaymentSuccessful
小部件作为
newRoute
传递,并将
"/Home"
路线作为谓词

  _navPaymentSuccessful(){
    Navigator.pushAndRemoveUntil(
      context, 
      MaterialPageRoute(
        builder: (context) => PaymentSuccessful()
      ), 
     ModalRoute.withName("/Home")
    );
  }

45
投票

接受的答案是正确的。但你也可以尝试这个。

Navigator.pushAndRemoveUntil<dynamic>(
        context,
        MaterialPageRoute<dynamic>(
          builder: (BuildContext context) => YourPageNameGoesHere(),
        ),
        (route) => false,//if you want to disable back feature set to false
);

17
投票

更简单,我认为更好的方法是这样做, 这会安排当前持久帧结束时的回调,以推送到路由

/loginPage
并删除所有先前的路由,这样您可以确保所有帧都已渲染,然后导航到下一页。

 SchedulerBinding.instance.addPostFrameCallback((_) {
                Navigator.of(context).pushNamedAndRemoveUntil(
                    '/loginPage', (Route<dynamic> route) => false);
              });

2
投票

我建议在您的付款成功页面中使用 WillPopScope 并在 onWillPop 方法中编写以下代码片段:

 return WillPopScope(
      onWillPop: (){
        Navigator.of(context)
            .pushNamedAndRemoveUntil('/Home', (Route<dynamic> route) => false);
      },
      child: Scaffold()
};

2
投票

如果您想将参数传递到新页面,请尝试此操作:

Navigator.of(context).pushNamedAndRemoveUntil(
      '/new-route-name',
      arguments: {
         any object
      },
      ModalRoute.withName("/the-route-name-that-you-want-back-to-it")
);

1
投票

如果您只想从堆栈中删除单个屏幕,那么您可以这样做

Navigator.of(context).pushReplacementNamed(
                  RouteHelper.navbar, //this is our other route name
                  arguments: {code}, // this is the argument which we are sending to second screen
                );

希望,这对某人有帮助。


0
投票

如果您想导航到新屏幕并清除所有以前的屏幕,请使用此功能,

Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => NewScreen()),(route)=>false);
© www.soinside.com 2019 - 2024. All rights reserved.