Olá, Vinicius! Tudo bem?
Existem algumas diferenças entre o tipo dynamic
e Object
, uma delas é que variáveis do tipo dynamic
podem ser atribuídas a qualquer tipo de valor, e essas variáveis por sua vez também podem ser atribuídas a qualquer tipo de variável, vamos ver esse exemplo pra entender melhor:
void main() {
//Atribuindo uma String em uma variável dynamic
dynamic nome = "Vinicius";
//Atribuindo uma variável dynamic a uma String, sem erros
String nomeStr = nome;
}
Mas o tipo Object
não trabalha da mesma forma? Não, o tipo Object
, pode receber sim qualquer tipo, contudo não conseguimos atribuir ele a alguma variável do mesmo tipo que ele contém da mesma forma que fizemos com dynamic
, no caso dele nós precisamos fazer uma conversão. Por exemplo:
void main() {
//Object recebe um tipo inteiro
Object idade = 22;
//Precisamos converter o Objeto em inteiro para então atribuí-lo
int idadeInteiro = idade as int;
}
Outra diferença é que o tipo Object
não aceita valores nulos (se não utilizar o Object?
, declarando que é nulável), enquanto o dynamic
sim. Abaixo um exemplo:
main() {
dynamic str = null; // aceita sem erros
Object objeto = null; // Erro de compilação
}
Por fim, mais uma diferença é que se você criar uma instância de uma classe com dynamic
, você consegue acessar métodos e propriedades, enquanto se criar com Object
não. Veja o exemplo:
class Pessoa {
imprimeNome() => print("Vinicius");
}
void main() {
dynamic pessoaD = new Pessoa();
Object pessoaO = new Pessoa();
pessoaD.imprimeNome(); // Sem erros
pessoaO.imprimeNome(); // Erro de compilação
}
Em resumo, o tipo dynamic
é um tipo mais flexível, contudo pode causar erros em tempo de execução por esse mesmo motivo.
Na documentação de Dart, lemos que apesar de ser preferível usar Object
ou Object?
, um exceção é quando trabalhamos com APIs que também usam dynamic
, por ser um tipo genérico.
Pesquisei também sobre onde exatamente o tipo dynamic seria alocado e acho, mas não posso te dar certeza, que seria na heap mesmo, já a quantidade de memória necessária na alocação, não consigo te dizer mas talvez você possa buscar usar o Memory View do Flutter para isso, se quiser mesmo estudar mais a fundo.
Deixo aqui algumas fontes que usei para te dar a resposta, caso queira ver mais:
E também se quiser pode testar os códigos acima no DartPad, para entender melhor o funcionamento de dynamic
e Object
.
Espero muito que isso tenha te ajudado, qualquer coisa estamos aqui. Bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!