内容

avoid_futureor_void

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

此规则目前为实验性,可在 Dart 3.6 及更高版本中使用。

详情

#

避免使用 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/linter/issues/4622

用法

#

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

analysis_options.yaml
yaml
linter:
  rules:
    - avoid_futureor_void