将 `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,这些 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