avoid_dynamic_calls
避免对dynamic
目标进行方法调用或属性访问。
此规则从 Dart 2.12 开始可用。
详情
#请勿对显式或隐式静态类型为dynamic
的对象进行方法调用或访问属性。动态调用在每个运行时环境和编译器中的处理方式略有不同,但大多数生产模式(甚至某些开发模式)都与动态调用相关的编译大小和运行时性能损失。
此外,类型为dynamic
的目标会禁用大多数静态分析,这意味着与正确静态类型的 Dart 代码相比,更容易导致运行时NoSuchMethodError
或TypeError
。
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
除非另有说明,否则本网站上的文档反映的是 Dart 3.5.3。页面最后更新于 2024-07-03。 查看源代码 或 报告问题。