1
resposta

[Dúvida] Object? X dynamic

Boa noite!

No seguinte código:

List<Task> toList(List<Map<String, Object?>> mapList) {
    print("Convertendo to list");
    final List<Task> tasks = [];
    for (Map<String, Object?> map in mapList) {
      final Task task = Task(map[_name], map[_image], map[_difficulty]);
    }
  }

Gostaria de entender pq ele funciona com dynamic e não com Object?, sendo que o Object? é o tipo "original" do map. Oque ambos fazem de diferente nesse caso?

for (Map<String, Object?> map in mapList)
for (Map<String, dynamic> map in mapList)

obs: Ele da erro na seleção de valores logo na linha seguinte:

Task(map[_name], map[_image], map[_difficulty])

Agradeço a atenção!

1 resposta

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