内容

avoid_futureor_void

避免使用 'FutureOr' 作为结果的类型。

此规则当前处于 **实验性** 状态,尚未在稳定版 SDK 中提供。

详情

#

**避免** 使用 FutureOr<void> 作为结果的类型。此类型存在问题,因为它可能看起来像是在编码一个结果,该结果要么是 Future<void>,要么是结果应该被丢弃(当它为 void 时)。但是,没有安全的方法来检测我们是在哪种情况下(因为类型为 void 的表达式可以评估为任何对象,包括任何类型的期货)。

从概念上讲,拥有一个类型,其含义类似于“忽略此对象;另外,也看一下,因为它可能是一个期货”也是不合理的。

对于 FutureOr<void> 类型的逆变出现(例如,对于形式参数的类型),会做出一个例外,并且不会为此类出现发出警告。做出此例外的理由是,此类型不描述结果,它描述了由其他人提供的值的约束。类似地,对于类型别名声明,也会做出一个例外,因为它们很可能在逆变位置使用(例如,作为形式参数的类型)。因此,在类型别名声明中,只检查类型参数边界。

FutureOr<void> 类型的替代品,通常很有用的是 Future<void>?。此类型表示结果要么是 Future<void>,要么是 null,并且在运行时不会出现歧义,因为没有对象可以同时具有这两种类型。

并非总是可以使用 Future<void>? 类型来替换 FutureOr<void> 类型,因为后者是所有类型的超类型,而前者不是。在这种情况下,一个有用的补救措施可能是用 void 类型替换 FutureOr<void>

错误

dart
FutureOr<void> m() {...}

正确

dart
Future<void>? m() {...}

**此规则为实验性。** 正在对其进行评估,可能会发生变更或删除。欢迎您提供关于其行为的反馈!主要问题位于此处:https://github.com/dart-lang/linter/issues/4622

用法

#

要启用 avoid_futureor_void 规则,请在 linter > rules 下,在您的 analysis_options.yaml 文件中添加 avoid_futureor_void

analysis_options.yaml
yaml
linter:
  rules:
    - avoid_futureor_void