跳到主要内容

avoid_futureor_void

实验性

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

详情

#

避免FutureOr<void> 用作结果的类型。这种类型存在问题,因为它可能看似表示结果要么是 Future<void>,要么结果应该被丢弃(当它是 void 时)。然而,无法安全地检测我们拥有哪种情况(因为 void 类型的表达式可以评估为任何对象,包括任何类型的 future)。

从概念上讲,拥有一个意义类似于“忽略此对象;另外,看一眼它,因为它可能是 Future”的类型也是不健全的。

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

一个经常有用的 FutureOr<void> 类型的替代方案是 Future<void>?。这种类型表示结果要么是 Future<void>,要么是 null,并且在运行时没有歧义,因为没有对象可以同时拥有这两种类型。

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

不好

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

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

此规则是实验性的。 正在评估中,可能会更改或删除。欢迎提供对其行为的反馈!主要问题在此:https://github.com/dart-lang/sdk/issues/59232。

启用

#

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

analysis_options.yaml
yaml
linter:
  rules:
    - avoid_futureor_void

如果您改用 YAML 映射语法配置 Linter 规则,请在 linter > rules 下添加 avoid_futureor_void: true

analysis_options.yaml
yaml
linter:
  rules:
    avoid_futureor_void: true