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
类型可能是一个有用的补救措施。
不好
FutureOr<void> m() {...}
好
Future<void>? m() {...}
此规则是实验性的。 正在评估中,可能会更改或删除。欢迎提供对其行为的反馈!主要问题在此:https://github.com/dart-lang/sdk/issues/59232。
启用
#要启用 avoid_futureor_void
规则,请在您的 analysis_options.yaml
文件中,在 linter > rules 下添加 avoid_futureor_void
linter:
rules:
- avoid_futureor_void
如果您改用 YAML 映射语法配置 Linter 规则,请在 linter > rules 下添加 avoid_futureor_void: true
linter:
rules:
avoid_futureor_void: true