跳到主要内容

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