avoid_futureor_void
型 'FutureOr' を使用しないでください。
説明
#アナライザーは、型 FutureOr<void> が結果の型として使用されている(正確には、反変でない位置で使用されている)場合に、この診断を生成します。型 FutureOr<void> は、結果が Future<void> であるか、または結果が破棄されるべきである(void の場合)ことをエンコードしているように見える可能性があるため、問題があります。しかし、どちらのケースであるかを安全に検出する方法はありません。なぜなら、void 型の式は、将来の型を含む任意のオブジェクトに評価される可能性があるからです。
「このオブジェクトを無視してください。また、将来のものである可能性があるため、注意してください」といった意味を持つ型を持つことは、概念的にも健全ではありません。
型 FutureOr<void> の反変な出現(例:形式パラメータの型)については例外があり、これらの出現に対して警告は発行されません。この例外の理由は、型が結果を表すのではなく、他者から提供される値に対する制約を表すからです。同様に、型エイリアスの宣言についても例外が設けられています。なぜなら、それらは反変な位置(例:形式パラメータの型)で使用される可能性があるからです。したがって、型エイリアスの宣言では、型パラメータの境界のみがチェックされます。
例
#import 'dart:async';
FutureOr<void> m() => null;一般的な修正
#型 FutureOr<void> の代替としてよく使用されるのは Future<void>? です。この型は、結果が Future<void> であるか、または null であることをエンコードしており、実行時にはオブジェクトが両方の型を持つことができないため、曖昧さはありません。
Future<void>? を FutureOr<void> の代替として常に使用できるとは限りません。なぜなら、後者はすべての型のスーパータイプであり、前者はそうではないからです。この場合、FutureOr<void> を型 void に置き換えることが有効な解決策となる場合があります。