avoid_dynamic_calls
dynamic
型のターゲットに対するメソッド呼び出しまたはプロパティアクセスを避けてください。
このルールは、Dart 2.12 以降で使用できます。
詳細
#実行すべきこと 明示的または暗黙的に静的にdynamic
型付けされたオブジェクトのプロパティへのアクセスやメソッド呼び出しを避けてください。動的な呼び出しは、各ランタイム環境やコンパイラでわずかに異なる方法で処理されますが、ほとんどのプロダクションモード(そしていくつかの開発モードでも)、コンパイルサイズとランタイムパフォーマンスの両方にペナルティが伴います。
さらに、dynamic
型付けされたターゲットはほとんどの静的解析を無効にするため、適切に静的に型付けされた Dart コードよりも、ランタイムのNoSuchMethodError
またはTypeError
が発生しやすくなります。
Object?
上に存在するメソッドとプロパティには例外があります。
a.hashCode
a.runtimeType
a.noSuchMethod(someInvocation)
a.toString()
…これらのメンバは、ウェブベースのランタイムでは動的にディスパッチされますが、VMベースのランタイムではディスパッチされません。さらに、これらは非常に一般的であるため、例えばany.toString()
やany == true
を許可しないことは非常に厳しすぎます。
Function
は型であるにもかかわらず、そのセマンティクスはdynamic
とほぼ同一であり、Function
型付けされたオブジェクトへの呼び出しもこのlintをトリガーすることに注意してください。
キャスト式(as dynamic
またはas Function
)では、動的な呼び出しが許可されます。
悪い例
void explicitDynamicType(dynamic object) {
print(object.foo());
}
void implicitDynamicType(object) {
print(object.foo());
}
abstract class SomeWrapper {
T doSomething<T>();
}
void inferredDynamicType(SomeWrapper wrapper) {
var object = wrapper.doSomething();
print(object.foo());
}
void callDynamic(dynamic function) {
function();
}
void functionType(Function function) {
function();
}
良い例
void explicitType(Fooable object) {
object.foo();
}
void castedType(dynamic object) {
(object as Fooable).foo();
}
abstract class SomeWrapper {
T doSomething<T>();
}
void inferredType(SomeWrapper wrapper) {
var object = wrapper.doSomething<Fooable>();
object.foo();
}
void functionTypeWithParameters(Function() function) {
function();
}
使用方法
#avoid_dynamic_calls
ルールを有効にするには、analysis_options.yaml
ファイルのlinter > rulesセクションにavoid_dynamic_calls
を追加します。
linter:
rules:
- avoid_dynamic_calls
特に明記されていない限り、このサイトのドキュメントは Dart 3.5.3 を反映しています。ページの最終更新日は 2024年7月3日です。 ソースを表示 または 問題を報告する.