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!