Olá, Cauê, tudo bem?
Quando você define um mapa como Map<String, dynamic>
, significa que os valores desse mapa podem ser de qualquer tipo, e o Dart permite que você acesse e manipule esses valores livremente, inclusive utilizando diretamente como parâmetros em construtores, desde que faça as conversões corretas caso o tipo esperado seja diferente.
Já quando você usa Map<String, Object?>
, o Dart entende que os valores podem ser qualquer objeto ou null
, mas ele pede que você faça casting explícito ao acessar e usar esses valores, pois Object?
não tem garantias sobre o que realmente está guardando ali. Por exemplo, ao fazer map[_name]
, o tipo retornado é Object?
, e o Dart não sabe se aquilo é realmente uma String
, um int
ou qualquer outro tipo.
Por isso, ao tentar criar um Task
usando Task(map[_name], map[_image], map[_difficulty])
, o Dart mostra erro, já que os parâmetros do construtor Task
esperam tipos específicos, mas você está fornecendo um Object?
para cada campo. Para corrigir usando Object?
, você precisaria fazer algo assim:
final Task task = Task(
map[_name] as String,
map[_image] as String,
map[_difficulty] as int,
);
Usando dynamic
, o Dart faz um casting automático em tempo de execução, por isso a linha funciona sem erro de compilação.
Espero ter ajudado.
Siga firme nos seus estudos e conte com o fórum sempre que precisar.
Abraços :)
Caso este post tenha lhe ajudado, por favor, marcar como solucionado