内容

avoid_dynamic_calls

避免对dynamic目标进行方法调用或属性访问。

此规则从 Dart 2.12 开始可用。

详情

#

请勿对显式或隐式静态类型为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 dynamicas 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