Pular para o conteúdo principal

avoid_dynamic_calls

Saiba mais sobre a regra de lint avoid_dynamic_calls.

Estável
Lançado no Dart 2.12

Evite chamadas de métodos ou acessos a propriedades em um alvo dynamic.

Detalhes

#

FAÇA evitar chamar métodos ou acessar propriedades de um objeto que é tipado explícita ou implicitamente como dynamic. Chamadas dinâmicas são tratadas de forma ligeiramente diferente em cada ambiente de execução e compilador, mas a maioria dos modos de produção (e até alguns modos de desenvolvimento) tem penalidades de tamanho de compilação e de desempenho em tempo de execução associadas a chamadas dinâmicas.

Além disso, alvos tipados como dynamic desativam a maior parte da análise estática, tornando exceções NoSuchMethodError e TypeError em tempo de execução mais prováveis do que em código Dart tipado estaticamente.

Há uma exceção para métodos e propriedades que existem em Object?:

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

... esses membros são despachados dinamicamente nos ambientes baseados na web, mas não nos baseados em VM. Além disso, são tão comuns que seria muito punitivo proibir any.toString() ou any == true, por exemplo.

Observe que, apesar de Function ser um tipo, a semântica é quase idêntica à de dynamic, e chamadas a um objeto tipado como Function também acionam esta regra.

Chamadas dinâmicas são permitidas em expressões de cast (as dynamic ou as Function).

RUIM:

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

BOM:

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

Ativar

#

Para ativar a regra avoid_dynamic_calls, adicione avoid_dynamic_calls em linter > rules no seu arquivo analysis_options.yaml:

analysis_options.yaml
yaml
linter:
  rules:
    - avoid_dynamic_calls

Se você usa a sintaxe de mapa YAML para configurar as regras de lint, adicione avoid_dynamic_calls: true em linter > rules:

analysis_options.yaml
yaml
linter:
  rules:
    avoid_dynamic_calls: true

Encontrou essa página sem tradução ou que precisa de correção? Abra uma issue e nos ajude a manter esse site em PT-BR para ajudar pessoas como você.