avoid_ dynamic_ calls
Saiba mais sobre a regra de lint avoid_dynamic_calls.
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.hashCodea.runtimeTypea.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:
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:
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:
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:
linter:
rules:
avoid_dynamic_calls: true
Salvo indicação em contrário, a documentação neste site reflete Dart 3.13.7. Relatar um problema.
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ê.