我正在我的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 方法,但它似乎没有用。
答案 0 :(得分:29)
离开 auth屏幕时,您需要使用Navigator.pushReplacement
。不仅仅是在重定向到登录页面时。
答案 1 :(得分:7)
您需要使用
Navigator
.of(_context)
.pushReplacement(new MaterialPageRoute(builder: (BuildContext context) => page));
其中_context
是BuildContext
的对象
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