目次

avoid_futureor_void

結果の型として 'FutureOr' を使用しないでください。

このルールは現在実験的であり、安定版SDKではまだ利用できません。

詳細

#

避けるべきこと:結果の型として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/linter/issues/4622

使用方法

#

avoid_futureor_voidルールを有効にするには、analysis_options.yamlファイルのlinter > rulesの下にavoid_futureor_voidを追加します

analysis_options.yaml
yaml
linter:
  rules:
    - avoid_futureor_void