Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dynamic é sinônimo de Object?

Ao definir um tipo como dynamic ele pode ser "qualquer coisa". Ao definir como Object também. Ambos são sinônimos no Dart? Senão, quanto de memória o compilador separa para uma variável do tipo dynamic? Ela vai ser alocada na Heap (suponho que as variáveis de tipo primitivo sejam armazenadas na Stack como nas demais linguagens tipadas)?

2 respostas
solução!

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!

Muito obrigado pela resposta tão detalhada, Jhoisnáyra. Eu dei uma pesquisada também e a única dúvida que permaneceu é justamente o local onde esse tipo de dado é armazenado. Vou seguir sua dica e usar o Memory View para ver se obtenho mais informações. :-D