跳到主内容

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 类型可能是一个有用的补救措施。