颤动:无需后退即可移至新屏幕

时间:2018-04-26 07:57:02

标签: navigation flutter navigator screens

我正在我的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 方法,但它似乎没有用。

9 个答案:

答案 0 :(得分:29)

离开 auth屏幕时,您需要使用Navigator.pushReplacement。不仅仅是在重定向到登录页面时。

答案 1 :(得分:7)

您需要使用

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

其中_contextBuildContext的对象 page是您定向到的页面。

答案 2 :(得分:1)

您可以使用pushAndRemoveUntil方法:

  

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

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

答案 3 :(得分:1)

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

routes: {

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

每当您要推入并卸下后盖时,请使用以下代码

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

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

答案 4 :(得分:0)

每当您要推入并移除后退箭头时,请使用以下代码

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我通过从当前页面弹出并显示新页面解决了这个问题:

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:-1)

只需添加以下代码:

UserControl