消除 nullOk 参数
摘要
#本迁移指南描述了如何将使用多个 of
静态访问器及相关访问器上的 nullOk
参数的代码转换为使用具有可空返回值的备用 API。
上下文
#Flutter 有一种常见的模式,允许使用通常称为 of
的静态成员函数查找某些类型的 Widget(InheritedWidget
),并且这些函数接受一个 BuildContext
。
在非空性成为默认值之前,在这些 API 上使用切换来在 Widget 不存在于 Widget 树中时抛出异常和在未找到时返回 null 之间切换非常有用。这很有用,而且并不令人困惑,因为每个变量都是可空的。
当非空性成为默认值时,希望最常用的 API 返回非空值。这是因为在调用 MediaQuery.of(context, nullOk: false)
后,仍然需要使用 !
运算符或 ?
以及后续的回退值,这感觉很笨拙。
nullOk
参数是一种提供空安全切换的廉价方式,但在真正的语言支持非空性的情况下,它为开发人员提供了冗余且可能矛盾的信号。
为了解决这个问题,of
访问器(以及一些也使用 nullOk
的相关访问器)被拆分为两个调用:一个返回非空值并在找不到所需的 Widget 时抛出异常,另一个返回可空值,不抛出异常,并在找不到 Widget 时返回 null。
此更改的设计文档为 消除 nullOk 参数。
更改说明
#实际更改修改了这些 API,使其不再具有 nullOk
参数,并返回非空值
MediaQuery.of
Navigator.of
ScaffoldMessenger.of
Scaffold.of
Router.of
Localizations.localeOf
FocusTraversalOrder.of
FocusTraversalGroup.of
Focus.of
Shortcuts.of
Actions.handler
Actions.find
Actions.invoke
AnimatedList.of
SliverAnimatedList.of
CupertinoDynamicColor.resolve
CupertinoDynamicColor.resolveFrom
CupertinoUserInterfaceLevel.of
CupertinoTheme.brightnessOf
CupertinoThemeData.resolveFrom
NoDefaultCupertinoThemeData.resolveFrom
CupertinoTextThemeData.resolveFrom
MaterialBasedCupertinoThemeData.resolveFrom
并在这些 API 旁边引入了这些新的 API,以返回可空值
MediaQuery.maybeOf
Navigator.maybeOf
ScaffoldMessenger.maybeOf
Scaffold.maybeOf
Router.maybeOf
Localizations.maybeLocaleOf
FocusTraversalOrder.maybeOf
FocusTraversalGroup.maybeOf
Focus.maybeOf
Shortcuts.maybeOf
Actions.maybeFind
Actions.maybeInvoke
AnimatedList.maybeOf
SliverAnimatedList.maybeOf
CupertinoDynamicColor.maybeResolve
CupertinoUserInterfaceLevel.maybeOf
CupertinoTheme.maybeBrightnessOf
迁移指南
#为了修改您的代码以使用 API 的新形式,请将所有包含 nullOk = true
作为参数的调用的实例转换为改为使用 API 的 maybe
形式。
所以这个
MediaQueryData? data = MediaQuery.of(context, nullOk: true);
变成
MediaQueryData? data = MediaQuery.maybeOf(context);
您还需要修改所有使用 nullOk = false
(通常是默认值)调用 API 的实例,以接受非空返回值,或删除所有 !
运算符
所以两者中的任何一个
MediaQueryData data = MediaQuery.of(context)!; // nullOk false by default.
MediaQueryData? data = MediaQuery.of(context); // nullOk false by default.
都变成
MediaQueryData data = MediaQuery.of(context); // No ! or ? operator here now.
unnecessary_non_null_assertion
分析选项在查找应删除 !
运算符的位置方面非常有用,而 unnecessary_nullable_for_final_variable_declarations
分析选项在查找 final
和 const
变量上不必要的问号运算符方面非常有用。
时间线
#合并到版本:1.24.0
稳定版发布:2.0.0
参考文献
#API 文档
MediaQuery.of
Navigator.of
ScaffoldMessenger.of
Scaffold.of
Router.of
Localizations.localeOf
FocusTraversalOrder.of
FocusTraversalGroup.of
Focus.of
Shortcuts.of
Actions.handler
Actions.find
Actions.invoke
AnimatedList.of
SliverAnimatedList.of
CupertinoDynamicColor.resolve
CupertinoDynamicColor.resolveFrom
CupertinoUserInterfaceLevel.of
CupertinoTheme.brightnessOf
CupertinoThemeData.resolveFrom
NoDefaultCupertinoThemeData.resolveFrom
CupertinoTextThemeData.resolveFrom
MaterialBasedCupertinoThemeData.resolveFrom
MediaQuery.maybeOf
Navigator.maybeOf
ScaffoldMessenger.maybeOf
Scaffold.maybeOf
Router.maybeOf
Localizations.maybeLocaleOf
FocusTraversalOrder.maybeOf
FocusTraversalGroup.maybeOf
Focus.maybeOf
Shortcuts.maybeOf
Actions.maybeFind
Actions.maybeInvoke
AnimatedList.maybeOf
SliverAnimatedList.maybeOf
CupertinoDynamicColor.maybeResolve
CupertinoUserInterfaceLevel.maybeOf
CupertinoTheme.maybeBrightnessOf
相关问题
相关 PR
- 删除
MediaQuery.of
中的nullOk
- 删除
Navigator.of
中的nullOk
- 删除
AnimatedList.of
和SliverAnimatedList.of
中的nullOk
参数 - 删除
Shortcuts.of
、Actions.find
和Actions.handler
中的nullOk
参数 - 删除
Focus.of
、FocusTraversalOrder.of
和FocusTraversalGroup.of
中的nullOk
参数 - 删除
Localizations.localeOf
中的nullOk
参数 - 删除
Router.of
中的nullOk
参数 - 删除
Scaffold.of
和ScaffoldMessenger.of
中的nullOk
- 删除 Cupertino 颜色解析 API 中的
nullOk
参数 - 删除
Localizations.localeOf
中残留的nullOk
参数 - 删除
Actions.invoke
中的nullOk
,添加Actions.maybeInvoke
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面上次更新于 2024-04-04。 查看源代码 或 报告问题.