我正在尝试构建一个流程,如果用户未登录,则应用程序会将登录页面压入堆栈。完成登录后,会弹出登录页面并返回主页。
虽然推送有效,但pop段不会 - 我可以让pop返回要推送的值,但是我无法关闭/ login路由。我错过了什么吗?
home_page.dart
class _HomePageState extends State<HomePage> with UserAccount {
@override
void initState() {
super.initState();
if (!isLoggedIn) {
print("not logged in, going to login page");
SchedulerBinding.instance.addPostFrameCallback((_) async{
var _val = await Navigator.of(context).pushNamed("/login");
print("I SHOULD HAVE POPPED");
print(_val);
Navigator.of(context).pop();
});
}
}
login_page.dart
class _LoginPageState extends State<LoginPage> with UserAccount {
void _googleLogin() async {
await googleClient.doGooglesignIn();
Navigator.of(context).pop(true);
}
产生的行为是:
1.按下登录屏幕
我可以登录
3.完成登录后,打印(“我应该已经弹出”)
4. print(_val)返回true
流行音乐似乎不起作用......
答案 0 :(得分:1)
这是因为pushNamed
隐藏当前视图以显示新视图。
这意味着您的旧视图不再位于窗口小部件树上。因此,您以前用Navigator.of(context)
完成的上下文不再存在。
您可以做的是将Navigator.of(context)
的结果存储在局部变量中。并重复使用它来同时调用pushNamed
和pop
。
final navigator = Navigator.of(context);
await navigator.pushNamed('/login');
navigator.pop();