概述

#

本迁移指南介绍了如何转换使用各种静态 `of` 函数的代码,这些函数过去从上下文中检索信息时返回可空值,但现在返回非空值。

背景

#

Flutter 有一种常见模式,即允许使用通常称为 `of` 的静态成员函数查找某些类型的 widget(通常是 InheritedWidget,但也包括其他)。

当非空性成为默认值时,希望最常用的 API 返回非空值。这是因为,在调用 `Scrollable.of(context)` 之后仍然需要 `!` 运算符或 `?` 以及一个备用值,这感觉很别扭,不符合 Dart 非空代码的习惯。

大部分迁移是在我们 之前的迁移 中取消 `nullOk` 参数时进行的,但有一些 `of` 方法在该迁移中被遗漏了,另一些后来添加时采用了可空返回类型,这与我们的常见模式相悖。

在此次迁移中,受影响的 `of` 访问器被拆分为两个调用:一个返回非空值,并在所需值不存在时抛出异常(仍称为 `of`),另一个返回可空值,不抛出异常,如果值不存在则返回 null(一个新方法,称为 `maybeOf`)。

变更说明

#

此更改修改了这些静态 `of` API,使其返回非空值。如果未找到值,它们现在还会在调试模式下断言,并在发布模式下抛出异常。

此更改还在上述函数旁边引入了新的静态 `maybeOf` API,它们返回相同值的可空版本,并且如果未找到值,则仅返回 null,而不会抛出任何异常。

迁移指南

#

要修改代码以使用新的 API 形式,首先将所有原始静态 `of` 函数(其可空性很重要)的实例转换为使用 `maybeOf` 形式。

迁移前的代码

dart
ScrollController? controller = Scrollable.of(context);

迁移后的代码

dart
ScrollController? controller = Scrollable.maybeOf(context);

然后,对于代码调用 `of` API 后跟着感叹号的实例,只需删除感叹号:它不再能返回可空值。

迁移前的代码

dart
ScrollController controller = Scrollable.of(context)!;

迁移后的代码

dart
ScrollController controller = Scrollable.of(context);

以下内容也可能有帮助

时间线

#

稳定版发布于: 3.7

参考资料

#

API 文档

相关 PR