跳至主要内容

消除 nullOk 参数

摘要

#

本迁移指南描述了如何将使用多个 of 静态访问器及相关访问器上的 nullOk 参数的代码转换为使用具有可空返回值的备用 API。

上下文

#

Flutter 有一种常见的模式,允许使用通常称为 of 的静态成员函数查找某些类型的 Widget(InheritedWidget),并且这些函数接受一个 BuildContext

在非空性成为默认值之前,在这些 API 上使用切换来在 Widget 不存在于 Widget 树中时抛出异常和在未找到时返回 null 之间切换非常有用。这很有用,而且并不令人困惑,因为每个变量都是可空的。

当非空性成为默认值时,希望最常用的 API 返回非空值。这是因为在调用 MediaQuery.of(context, nullOk: false) 后,仍然需要使用 ! 运算符或 ? 以及后续的回退值,这感觉很笨拙。

nullOk 参数是一种提供空安全切换的廉价方式,但在真正的语言支持非空性的情况下,它为开发人员提供了冗余且可能矛盾的信号。

为了解决这个问题,of 访问器(以及一些也使用 nullOk 的相关访问器)被拆分为两个调用:一个返回非空值并在找不到所需的 Widget 时抛出异常,另一个返回可空值,不抛出异常,并在找不到 Widget 时返回 null。

此更改的设计文档为 消除 nullOk 参数

更改说明

#

实际更改修改了这些 API,使其不再具有 nullOk 参数,并返回非空值

并在这些 API 旁边引入了这些新的 API,以返回可空值

迁移指南

#

为了修改您的代码以使用 API 的新形式,请将所有包含 nullOk = true 作为参数的调用的实例转换为改为使用 API 的 maybe 形式。

所以这个

dart
MediaQueryData? data = MediaQuery.of(context, nullOk: true);

变成

dart
MediaQueryData? data = MediaQuery.maybeOf(context);

您还需要修改所有使用 nullOk = false(通常是默认值)调用 API 的实例,以接受非空返回值,或删除所有 ! 运算符

所以两者中的任何一个

dart
MediaQueryData data = MediaQuery.of(context)!; // nullOk false by default.
MediaQueryData? data = MediaQuery.of(context); // nullOk false by default.

都变成

dart
MediaQueryData data = MediaQuery.of(context); // No ! or ? operator here now.

unnecessary_non_null_assertion 分析选项在查找应删除 ! 运算符的位置方面非常有用,而 unnecessary_nullable_for_final_variable_declarations 分析选项在查找 finalconst 变量上不必要的问号运算符方面非常有用。

时间线

#

合并到版本:1.24.0
稳定版发布:2.0.0

参考文献

#

API 文档

相关问题

相关 PR