跳到主內容

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 型別可能是一個有用的補救措施。