将 `of` 迁移到非空返回值,并添加 `maybeOf`
概述
#本迁移指南介绍了如何转换使用各种静态 `of` 函数的代码,这些函数过去从上下文中检索信息时返回可空值,但现在返回非空值。
背景
#Flutter 有一种常见模式,即允许使用通常称为 `of` 的静态成员函数查找某些类型的 widget(通常是 InheritedWidget
,但也包括其他)。
当非空性成为默认值时,希望最常用的 API 返回非空值。这是因为,在调用 `Scrollable.of(context)` 之后仍然需要 `!` 运算符或 `?` 以及一个备用值,这感觉很别扭,不符合 Dart 非空代码的习惯。
大部分迁移是在我们 之前的迁移 中取消 `nullOk` 参数时进行的,但有一些 `of` 方法在该迁移中被遗漏了,另一些后来添加时采用了可空返回类型,这与我们的常见模式相悖。
在此次迁移中,受影响的 `of` 访问器被拆分为两个调用:一个返回非空值,并在所需值不存在时抛出异常(仍称为 `of`),另一个返回可空值,不抛出异常,如果值不存在则返回 null(一个新方法,称为 `maybeOf`)。
变更说明
#此更改修改了这些静态 `of` API,使其返回非空值。如果未找到值,它们现在还会在调试模式下断言,并在发布模式下抛出异常。
AutofillGroup.of
DefaultTabController.of
DefaultTextHeightBehavior.of
Form.of
HeroControllerScope.of
Material.of
Overlay.of
PageStorage.of
PrimaryScrollController.of
RenderAbstractViewport.of
RestorationScope.of
Scrollable.of
ScrollNotificationObserver.of
此更改还在上述函数旁边引入了新的静态 `maybeOf` API,它们返回相同值的可空版本,并且如果未找到值,则仅返回 null,而不会抛出任何异常。
AutofillGroup.maybeOf
DefaultTabController.maybeOf
DefaultTextHeightBehavior.maybeOf
Form.maybeOf
HeroControllerScope.maybeOf
Material.maybeOf
Overlay.maybeOf
PageStorage.maybeOf
PrimaryScrollController.maybeOf
RenderAbstractViewport.maybeOf
RestorationScope.maybeOf
Scrollable.maybeOf
ScrollNotificationObserver.maybeOf
迁移指南
#要修改代码以使用新的 API 形式,首先将所有原始静态 `of` 函数(其可空性很重要)的实例转换为使用 `maybeOf` 形式。
迁移前的代码
ScrollController? controller = Scrollable.of(context);
迁移后的代码
ScrollController? controller = Scrollable.maybeOf(context);
然后,对于代码调用 `of` API 后跟着感叹号的实例,只需删除感叹号:它不再能返回可空值。
迁移前的代码
ScrollController controller = Scrollable.of(context)!;
迁移后的代码
ScrollController controller = Scrollable.of(context);
以下内容也可能有帮助
unnecessary_non_null_assertion
(linter 消息)识别应移除 `!` 运算符的位置unnecessary_null_checks
(分析选项)识别不需要 `?` 运算符的位置unnecessary_null_in_if_null_operators
识别不需要 `??` 运算符的位置unnecessary_nullable_for_final_variable_declarations
(分析选项)查找 `final` 和 `const` 变量上不必要的问号运算符
时间线
#稳定版发布于: 3.7
参考资料
#API 文档
相关 PR