我正在我的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");
}
});
}
问题:我可以成功登录该应用程序,但是如果我在登录后点击返回按钮,它将返回到屏幕中的标志(我希望它将从应用程序退出(。
问题:如何在不返回的情况下从一个屏幕转移到另一个屏幕?
我需要以某种方式删除导航器历史记录吗?还是根本不使用导航器?我尝试了 navigator.replace 方法,但它似乎不起作用。
您也需要使用 Navigator.pushReplacement
时,当留下也需要使用auth屏幕。不仅是重定向到登录页面时。
您可以使用pushAndRemoveUntil
方法:
将给定的路线推到最紧密地封闭给定上下文的导航器上,然后删除所有以前的路由,直到
predicate
返回true。要删除按下路线下方的所有路线,请使用始终返回false (例如(Route<dynamic> route) => false
(的[RoutePredicate]。
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (context) => MainPage()),
(Route<dynamic> route) => false,
);
您需要使用
Navigator
.of(_context)
.pushReplacement(new MaterialPageRoute(builder: (BuildContext context) => page));
其中_context
是BuildContext
的对象和page
是您指向的页面。
只需添加以下代码:
Navigator.of(context).pushNamedAndRemoveUntil('/routeName', (route) => false);
我认为您可能已经解决了这个问题。但是您可以自动设置"自动绘制模拟:false"在您要导航的脚手架的Appbar中。
我通过从当前页面弹出并显示新页面来解决此问题:
Navigator.pop(context);
Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => newPage));
这是解决方案 -
使用pushandremoveuntil而不是按下
另外,可以使用维护状态:true
用于设置的根页
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(
builder: (context) => pageName, maintainState: true),
(Route<dynamic> route) => false);
为"推"页面一页到另一页
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => pageName,
maintainState: false),)
**如果您想在出现页面时始终刷新,则使用:**
维护状态:false
我们可以使用相同的路由喜欢:
routes: {
LoginScreen.route_name: (_) => LoginScreen(),
.....
},
并在要推开和删除背面时使用以下代码
Navigator.of(context).pushReplacementNamed(LoginScreen.route_name);
注意:定义窗口小部件内部的静态字符串
对于任何想知道有一个新参数的人需要返回false Navigator.of(context).pushNamedAndRemoveUntil('/', (route) => false);
Navigator.of(context, rootNavigator: true).pop();
Navigator.pushNamed(context, '/');
它对我不起作用,因为我使用的是房屋的投造,而不是在材料上使用初始浏览。
这是一个链接,有一个引起警告的链接,它帮助我发现了错误:https://docs.flutter.dev/cookbook/navigation/named-routes#2-define-tefine-tefine-tefine-tefine-the-routes
警告:使用initialRoute时,请勿定义家庭属性。
如果您正在使用getx state Management,则可以尝试此
Get.of(()=> NewPage());