概述

#

本迁移指南描述了如何将使用各种静态 `of` 函数来检索上下文信息(以前返回可空值,现在返回非可空值)的代码进行转换。

背景

#

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

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

之前的迁移 中,我们在消除 `nullOk` 参数时完成了大部分迁移,但其中一些 `of` 方法在此次迁移中被遗漏,还有一些随后被添加了可空返回值类型,这与我们的通用模式相悖。

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

变更说明

#

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

此更改还在上述函数旁边引入了新的静态 `maybeOf` API,这些 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