跳到主要內容

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

不良範例

dart
FutureOr<void> m() {...}

良好範例

dart
Future<void>? m() {...}

此規則為實驗性質。 正在評估中,可能會變更或移除。歡迎針對其行為提供意見反應!主要問題在此:https://github.com/dart-lang/sdk/issues/59232。

啟用

#

若要啟用 avoid_futureor_void 規則,請在您的 analysis_options.yaml 檔案中的 linter > rules 下新增 avoid_futureor_void

analysis_options.yaml
yaml
linter:
  rules:
    - avoid_futureor_void

如果您改為使用 YAML 地圖語法來設定 linter 規則,請在 linter > rules 下新增 avoid_futureor_void: true

analysis_options.yaml
yaml
linter:
  rules:
    avoid_futureor_void: true