メインコンテンツにスキップ

avoid_dynamic_calls

安定版

dynamic 型のターゲットに対するメソッド呼び出しやプロパティアクセスを避けてください。

詳細

#

DO 明示的または暗黙的に静的型付けされた dynamic のオブジェクトに対するメソッド呼び出しやプロパティアクセスを避けてください。動的呼び出しは、ランタイム環境やコンパイラごとにわずかに異なる扱いを受けますが、ほとんどのプロダクションモード(および一部の開発モード)では、コンパイルサイズとランタイムパフォーマンスの両方にペナルティが関連付けられています。

さらに、dynamic 型のターゲットはほとんどの静的解析を無効にするため、適切に静的型付けされた Dart コードよりも、ランタイムで NoSuchMethodErrorTypeError が発生しやすくなります。

Object? に存在するメソッドやプロパティには例外があります。

  • a.hashCode
  • a.runtimeType
  • a.noSuchMethod(someInvocation)
  • a.toString()

… これらのメンバーは Web ベースのランタイムでは動的にディスパッチされますが、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

代わりに YAML マップ構文を使用して linter ルールを構成している場合は、linter > rules の下に avoid_dynamic_calls: true を追加してください。

analysis_options.yaml
yaml
linter:
  rules:
    avoid_dynamic_calls: true