【问题标题】:Navigator.pop() not popping latest route offNavigator.pop() 没有弹出最新的路线
【发布时间】:2018-09-01 11:54:45
【问题描述】:

我正在尝试构建一个流程,如果用户未登录,应用程序会将登录页面推送到堆栈上。一旦他们完成登录,它就会弹出登录页面并返回主页。

虽然 push 有效,但 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.登录界面被推送​​
2. 我可以登录
3. print("I SHOULD HAVE POPPED") 在我完成登录后运行
4. print(_val) 返回 true
5. pop 好像不行……

【问题讨论】:

  • 您正在使用Navigator.of(context),但您在使用它时没有任何上下文,因此它可能没有调用您期望的导航器。

标签: routing dart flutter


【解决方案1】:

这是因为pushNamed隐藏当前视图以显示新视图。

这意味着您的旧视图不再位于小部件树上。因此,您过去使用Navigator.of(context) 的上下文不再存在。

您可以做的是将Navigator.of(context) 的结果存储在局部变量中。并重用它来调用pushNamedpop

final navigator = Navigator.of(context);
await navigator.pushNamed('/login');
navigator.pop();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2020-11-23
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多