目次

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)では、動的な呼び出しが許可されます。

悪い例

dart
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();
}

良い例

dart
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を追加します。

analysis_options.yaml
yaml
linter:
  rules:
    - avoid_dynamic_calls