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

Dar*_*han 24 navigation screens navigator flutter

我正在我的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");
      }
    });
  }
Run Code Online (Sandbox Code Playgroud)

问题:我可以成功登录该应用,但如果我在登录后点击后退按钮,则会返回到登录屏幕(我希望它从应用中退出).

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

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

Rém*_*let 54

您需要使用Navigator.pushReplacement留下的身份验证屏幕太大.不仅仅是在重定向到登录页面时.

  • 命名路由器的Navigator.pushReplacementNamed(context,'/ route') (7认同)
  • Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => HomeScreen(), ), ); Navigator.pushReplacement() 不起作用。从当前屏幕重定向到主屏幕后,主屏幕仍然显示后退箭头图标。还有其他解决方案吗?请分享。 (2认同)
  • Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (context) => HomeScreen()), (Route<dynamic> 路线) => false, ); 为我工作。 (2认同)

Pul*_*aid 11

您需要使用

Navigator
    .of(_context)
    .pushReplacement(new MaterialPageRoute(builder: (BuildContext context) => page));
Run Code Online (Sandbox Code Playgroud)

And的_context对象在哪里,您定向到的页面是哪里。BuildContextpage

  • 当我按下后退按钮(辅助触摸)路线返回到上一页时,这不起作用 (2认同)

Mey*_*sam 10

您可以使用以下pushAndRemoveUntil方法:

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

Navigator.pushAndRemoveUntil(
  context,
  MaterialPageRoute(builder: (context) => MainPage()),
  (Route<dynamic> route) => false,
);
Run Code Online (Sandbox Code Playgroud)

  • 这比其他答案更好,因为即使您的堆栈中有多个路由,您仍然没有后退按钮。 (3认同)

小智 6

只需添加以下代码:

Navigator.of(context).pushNamedAndRemoveUntil('/routeName', (route) => false);
Run Code Online (Sandbox Code Playgroud)


the*_*ist 5

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


Sho*_*hin 5

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

Navigator.pop(context);
Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => newPage));
Run Code Online (Sandbox Code Playgroud)


Som*_*ath 5

这是解决方案 -

使用pushAndRemoveUntil代替pushReplacement

另外,可以使用维护状态:true

对于设置根页面

Navigator.pushAndRemoveUntil(
  context,
  MaterialPageRoute(
      builder: (context) => pageName, maintainState: true),
      (Route<dynamic> route) => false);
Run Code Online (Sandbox Code Playgroud)

对于将页面推送到另一页

Navigator.push(
context,
MaterialPageRoute(
    builder: (context) => pageName,
    maintainState: false),)
Run Code Online (Sandbox Code Playgroud)

**如果您想在出现页面时始终刷新,请使用:**

维护状态:假