【问题标题】:Calling Navigator.of anywhere without context?在没有上下文的情况下在任何地方调用 Navigator.of?
【发布时间】:2019-10-24 04:54:36
【问题描述】:

我一直在根据这个精彩的教程 (https://medium.com/coding-with-flutter/flutter-case-study-multiple-navigators-with-bottomnavigationbar-90eb6caa6dbf) 设置一个选项卡式导航应用程序。

现在我想显示一个覆盖整个屏幕的模态覆盖登录路径。我的登录控制器检查用户是否已登录,并且我想触发一个显示模式登录路由的事件。我现在遇到的问题是,我没有一个上下文对象来接收信号以显示登录路由:

Navigator.of(context).pushReplacementNamed('/');

我该如何解决这个问题或者这是错误的方法?

我的用户控制器是一个在应用启动时启动的单例对象。然后它检查用户数据模型,如果没有设置,它想调用登录​​屏幕/路由。

感谢任何指向正确方向的指针。 马丁

【问题讨论】:

  • 使用作为参数提供的顶级上下文初始化您的对象。

标签: flutter dart


【解决方案1】:

您可以使用 globalKey 来访问您喜欢的小部件的上下文(您必须在构造函数中向它传递一个键),并将其留在全局空间中,或者在任何类中保持静态...... 虽然不是最优雅的方法,但应该可以工作

【讨论】:

    【解决方案2】:

    您可以使用此包跳过所需的上下文。 https://pub.dev/packages/one_context

    // go to second page using named route
    OneContext().pushNamed('/second');
    // go to second page using MaterialPageRoute
    OneContext().push(MaterialPageRoute(builder: (_) => SecondPage()));
    

    【讨论】:

      【解决方案3】:

      定义一个从应用内任何地方访问的导航键(例如在主类全局空间中),并将其传递给构建方法中的根 MaterialApp 导航键属性

      final GlobalKey<NavigatorState> navigatorKey = new GlobalKey<NavigatorState>();
      

      然后:

        @override
        Widget build(BuildContext context) {
      
          return MaterialApp(
                    navigatorKey: navigatorKey,
              //...
          );
      }
      

      然后您可以通过以下方式访问任何地方的上下文:

      navigatorKey.currentContext
      

      导航示例:

      Navigator.of(navigatorKey.currentContext).pushReplacement(
        MaterialPageRoute(builder: (_) => SecondScreen()));
      

      【讨论】:

        猜你喜欢
        • 2020-05-03
        • 2020-10-28
        • 2019-05-13
        • 2022-01-21
        • 1970-01-01
        • 2012-07-17
        • 2012-07-01
        • 2013-05-19
        • 2022-06-28
        相关资源
        最近更新 更多