avoid_futureor_void
不要使用 'FutureOr
描述
#当类型 FutureOr<void>
被用作结果的类型(确切地说:它被用在非逆变的位置)时,分析器会产生此诊断。FutureOr<void>
类型是有问题的,因为它可能看起来表示结果要么是 Future<void>
,要么结果应该被丢弃(当它是 void
时)。然而,没有安全的方法可以检测我们是属于哪种情况,因为 void
类型的表达式可以评估为任何对象,包括任何类型的 future。
从概念上讲,拥有一个类型,其含义类似于“忽略此对象;另外,看一眼,因为它可能是 future”也是不健全的。
对于类型 FutureOr<void>
的逆变用法(例如,作为形式参数的类型),则例外处理,不会为此类用法发出警告。此例外的原因是该类型不描述结果,而是描述对他人提供的值的约束。类似地,类型别名声明也例外处理,因为它们很可能被用在逆变位置(例如,作为形式参数的类型)。因此,在类型别名声明中,仅检查类型参数的边界。
示例
#dart
import 'dart:async';
FutureOr<void> m() => null;
常见修复方法
#FutureOr<void>
类型的一个常用替代方案是 Future<void>?
。此类型表示结果要么是 Future<void>
,要么是 null,并且在运行时没有歧义,因为没有对象可以同时具有这两种类型。
将 Future<void>?
类型用作 FutureOr<void>
类型的替代方案并非总是可能,因为后者是所有类型的超类型,而前者不是。在这种情况下,将 FutureOr<void>
替换为 void
类型可能是一个有用的补救措施。