【问题标题】:Flutter - Navigate to a new screen, and clear all the previous screensFlutter - 导航到新屏幕,并清除所有以前的屏幕
【发布时间】:2019-03-12 08:15:58
【问题描述】:

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

注意:我已尝试pushReplacementNamed,但它不起作用。

【问题讨论】:

  • 我试过 pushReplacementNamed 但它不起作用。你可能做错了什么。
  • 不,我没有。使用pushRepalcementNamed 将我带到一条新路线,但是当我使用后退按钮时,我会转到最后一个命名路线而不是后退按钮不起作用。
  • 也许您想删除更多以前的路线,例如docs.flutter.io/flutter/widgets/Navigator/…,但您的问题不包含任何可以诊断您的问题的信息。
  • 是的。现在才发现。不过还是谢谢。

标签: android dart flutter


【解决方案1】:

我想通了。这是Navigator.pushAndRemoveUntil 函数。我必须将PaymentSuccessful 小部件作为newRoute 传递,并将"/Home" 路由作为谓词传递

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

【讨论】:

  • 您能否解释一下使用ModalRoute.withName('/Home') 完成您的答案的目的是什么?
  • @iDecode 您可以参考这里的文档 [api.flutter.dev/flutter/widgets/Navigator/… ModalRoute.withName('/Home') 用于确保按下后退按钮时用户导航到“/主屏幕" -> "要删除具有特定名称的路由,请使用从 ModalRoute.withName 返回的 RoutePredicate"
  • 如果您想导航到root 屏幕,请将"/Home" 替换为"/"。您还可以使用他的道具settings: RouteSettings(arguments: myArgs)MaterialPageRoute() 提供路由参数
  • 添加更多,这里是解释这个功能的视频:Tutorial Link
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    更简单,我认为更好的方法是这样做, 这会为当前持久帧的结束安排一个回调,以推送到路由 /loginPage 并删除所有以前的路由,这样您可以确保所有帧都被渲染,然后导航到下一页。

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-02
        • 2019-06-07
        • 2020-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多