【问题标题】:Meaning of the term .of() in flutter颤振中术语 .of() 的含义
【发布时间】:2021-03-24 01:03:49
【问题描述】:

所以我想知道关闭AlertDialog 时使用的命令:

FlatButton(
  child: Text('Okay'),
  onPressed: () {
    Navigator.of(context).pop();
  },
),

.of() 到底是做什么的?我在颤振开发文档中找不到任何内容(可能是因为我错过了正确的搜索词)

谁能解释那里发生了什么?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    来自Navigator 类的documentation

    虽然您可以直接创建导航器,但最常见的是使用由路由器创建的导航器,该导航器本身由 WidgetsApp 或 MaterialApp 小部件创建和配置。您可以使用 Navigator.of 引用该导航器。

    作为一般规则,每当您在 OO 语言中看到类似于 Classname.of(someObject) 的内容时,.of 是一个从 someObject 返回 Classname 实例的构建器。

    【讨论】:

      【解决方案2】:

      在 Flutter SDK 中,.of 方法是一种服务定位器函数,它以框架 BuildContext 作为参数并返回与命名类相关但由小部件树上层的小部件创建的内部 API。然后,子小部件可以使用这些 API 来访问父小部件上设置的状态,并在某些情况下(例如 Navigator)来操作它们。该模式鼓励组件化,并将与构建树相关的信息的产生与其消费解耦。

      除了Navigator.of(返回一个NavigatorState)还有:

      • Theme.of(返回一个包含环境主题设置的 ThemeData)
      • MediaQuery.of(返回一个 MediaQueryData,其中包含计算出的有关设备屏幕尺寸的信息)
      • Directionality.of(返回一个包含文本显示信息的 TextDirection)

      当然,Flutter 具有从构建上下文中查找父窗口小部件的非特定方法:

      context.findAncestorWidgetOfExactType<T extends Widget>()
      context.findAncestorStateOfType<T extends State>()
      context.findRootAncestorStateOfType<T extends State>()
      

      所以Theme.of(context)实际上只是context.findAncestorWidgetOfExactType&lt;Theme&gt;().data的静态简写,Navigator.of(context).pop()实际上只是context.findAncestorStateOfType&lt;NavigatorState&gt;().pop()的简写

      【讨论】:

      • 那么 .of 命令是否仅限于这些类?从理论上讲,如果我做对了,我应该能够将自己的 .of 实现到一个类中?例如,如果我想访问父小部件的抽屉。我应该能够用 Drawer.of(context) 得到它吗?
      • 我引用的方法是 Flutter SDK 作者在 Flutter 小部件类上提供的方法(可能还有其他方法,这些只是我想到的方法)。当然,您可以定义自己的 .of 方法来为您的小部件类做任何您喜欢的事情,但 IMO 调用“父 api 查找”例程 .of 是惯用的。我在自己的代码库中做了很多。
      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 2021-08-11
      • 2020-10-13
      • 1970-01-01
      相关资源
      最近更新 更多