【问题标题】:Flutter: Move to a new screen without providing navigate back to previous screenFlutter:移动到新屏幕而不提供返回上一屏幕的导航
【发布时间】:2018-10-06 20:12:09
【问题描述】:

我正在我的 Flutter 应用中实现身份验证流程。

尝试登录后,CheckAuth (检查用户是否登录,然后相应地打开主屏幕或注册屏幕)使用以下代码打开:

  void _signIn() async {
    await _auth
        .signInWithEmailAndPassword(
            email: _userEmail.trim(), password: _userPassword.trim())
        .then((task) {
      // go to home screen
      if (task.getIdToken() != null) {
        setState(() {
          Navigator.pushReplacement(
              context,
              new MaterialPageRoute(
                  builder: (BuildContext context) => new CheckAuth()));
        });
      } else {
        print("Authentication failed");
      }
    });
  }

问题:我可以成功登录应用程序,但如果我在登录后点击返回按钮,它会返回登录屏幕(虽然我希望它会退出应用程序)。

问题:如何在 Flutter 中从一个屏幕移动到另一个屏幕而无需返回?

我是否需要以某种方式删除导航器历史记录?或者根本不使用导航器?我尝试了 Navigator.replace 方法,但它似乎不起作用。

【问题讨论】:

  • 登录屏幕是您应用中的默认路由吗?
  • Navigator.pushReplacement() 在我这边工作得很好。可以分享一下完整代码吗?
  • @GünterZöchbauer 不,默认路由是 CheckAuth。问题是我有一个注册屏幕,在那里我有一个按钮,可以使用 Navigator.push 推送登录屏幕。因此,当用户登录并导航回来时,他又回到了注册屏幕。我用 Navigator.pushReplacement 替换了 Navigator.push,现在它可以正常工作了。谢谢!
  • @dhuma1981 是的,你是对的,.pushReplacement() 工作正常。问题是我有一个注册屏幕,在那里我有一个按钮,可以使用 Navigator.push 推送登录屏幕。因此,当用户登录并导航回来时,他又回到了注册屏幕。我用 Navigator.pushReplacement 替换了 Navigator.push,现在它可以正常工作了。谢谢!
  • Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => HomeScreen(), ), ); Navigator.pushReplacement() 不工作。从当前屏幕重定向到 HomeScreen 后,HomeScreen 仍然显示返回箭头图标。任何其他解决方案?请分享。

标签: flutter navigation screen navigator


【解决方案1】:

您也需要在离开身份验证屏幕时使用Navigator.pushReplacement。不仅在重定向到登录页面时。

【讨论】:

  • Navigator.pushReplacementNamed(context, '/route') 用于命名路由器
  • 谢谢。当我们在android中单击底部的返回按钮时,按钮页面不会返回主页。
  • 在我的情况下不起作用,在仪表板屏幕上显示后退箭头。我在登录屏幕上使用此代码: Navigator.of(context).poppushReplacementNamed(DashboardScreen.routeName);
  • Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => HomeScreen(), ), ); Navigator.pushReplacement() 不工作。从当前屏幕重定向到 HomeScreen 后,HomeScreen 仍然显示返回箭头图标。任何其他解决方案?请分享。
  • Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (context) => HomeScreen()), (Route route) => false, );为我工作。
【解决方案2】:

您可以使用pushAndRemoveUntil 方法:

将给定的路由推送到最紧密地包围给定上下文的导航器上,然后删除所有先前的路由,直到predicate 返回 true。 要删除推送路由下方的所有路由,请使用始终返回 false 的 [RoutePredicate](例如 (Route<dynamic> route) => false)。

Navigator.pushAndRemoveUntil(
  context,
  MaterialPageRoute(builder: (context) => MainPage()),
  (Route<dynamic> route) => false,
);

【讨论】:

  • 出于某种奇怪的原因,来自SplashScreenNavigator.of(context).pushReplacementNamed 无法正常工作(也就是目标屏幕AppBar 中的后退按钮),但来自不同屏幕的完全相同的调用确实有效。您的解决方案在这两种情况下都有效,很奇怪。谢谢!
  • 这比其他答案更好,因为即使您的堆栈中有多个路由,您仍然没有后退按钮。
  • 谢谢,我也遇到了同样的问题,你的回答帮我解决了..非常感谢
【解决方案3】:

你需要使用

Navigator
    .of(_context)
    .pushReplacement(new MaterialPageRoute(builder: (BuildContext context) => page));

_contextBuildContext 的对象 page 是您指向的页面。

【讨论】:

  • 当我按下后退按钮(辅助触摸)路线返回上一页时,这不起作用
【解决方案4】:

只要您想推动和移除后退箭头,请使用以下代码

onPressed: () {
          Navigator.pushAndRemoveUntil(
            context,
            MaterialPageRoute(builder: (context) => PathName()),
            (Route<dynamic> route) => false,
          );
},

【讨论】:

    【解决方案5】:

    我们可以使用相同的路由 喜欢:

    routes: {
    
            LoginScreen.route_name: (_) => LoginScreen(),
            .....
          },  
    

    只要你想推入和移除后台堆栈,就使用下面的代码

    Navigator.of(context).pushReplacementNamed(LoginScreen.route_name);
    

    注意:在小部件 LoginScreen 中定义静态字符串

    【讨论】:

      【解决方案6】:

      我已通过从当前页面弹出并显示新页面来解决此问题:

      Navigator.pop(context);
      Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => newPage));
      

      【讨论】:

        【解决方案7】:

        我想你可能已经解决了这个问题。但是您可以在您要导航到的 Scaffold 的 AppBar 中设置“automaticallyLeadingImplied: false”。

        【讨论】:

          【解决方案8】:

          只需添加以下代码:

          Navigator.of(context).pushNamedAndRemoveUntil('/routeName', (route) => false);
          

          【讨论】:

            【解决方案9】:

            对于任何想知道需要返回 false 的新参数的人Navigator.of(context).pushNamedAndRemoveUntil('/', (route) =&gt; false);

            【讨论】:

              【解决方案10】:

              如果你正在使用 Getx 状态管理,那么你可以试试这个

              Get.of(()=> NewPage());
              

              【讨论】:

                猜你喜欢
                • 2019-12-02
                • 2020-09-22
                • 2020-11-22
                • 2019-06-07
                • 1970-01-01
                • 1970-01-01
                • 2020-03-06
                • 2023-03-31
                • 2021-07-15
                相关资源
                最近更新 更多