跳至主要内容

将 `of` 迁移到非空返回值,并添加 `maybeOf`

摘要

#

本迁移指南描述了如何转换使用各种静态 of 函数从上下文检索信息的代码,这些函数以前返回可空值,但现在返回非空值。

上下文

#

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

当非空性成为默认值时,希望最常用的 API 返回非空值。这是因为在调用 Scrollable.of(context) 后仍然需要使用 ! 运算符或 ? 和回退值会让人感觉很笨拙,并且对于非空 Dart 代码来说也不符合惯例。

之前的一次迁移中,我们消除了 nullOk 参数,并且完成了许多此类迁移,但一些 of 方法在该迁移中被遗漏了,并且随后添加了一些具有可空返回类型的 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