2
respostas

[Dúvida] type 'String' is not a subtype of type 'Map<String, dynamic>'

Boa noite! Sou novo na Alura e estou com uma duvida com um projeto pessoal. Gostaria de primeiro resolver esse ponto que está me prendendo de progredir nesse projeto, antes de iniciar todos os cursos do qual tenho interesse em fazer. Eu procurei pelo fórum e olhei algumas aulas que estão relacionadas a Model, porém não encontrei o que pudesse me ajudar.

Tenho esse Model

import 'dart:convert';

import 'package:lockpass/models/type_model.dart';

class ItensModel {
  int? id;
  TypeModel? type;
  String? service;
  String? email;
  String? login;
  String? password;
  
  ItensModel({
    this.id,
    this.type,
    this.service,
    this.email,
    this.login,
    this.password,
  });

  ItensModel.empty():
    id = 0,
    type = TypeModel.empty(),
    service = '',
    email = '',
    login = '',
    password = '';  

  Map<String, dynamic> toMap() {
    return <String, dynamic>{
      'id': id,
      'type': type?.toMap(),
      'service': service,
      'email': email,
      'login': login,
      'password': password,
    };
  }

  factory ItensModel.fromMap(Map<String, dynamic> map) {
    return ItensModel(
      id: map['id'] != null ? map['id'] as int : null,
      type: map['type'] != null ? TypeModel.fromMap(map['type'] as Map<String,dynamic>) : null,
      service: map['service'] != null ? map['service'] as String : null,
      email: map['email'] != null ? map['email'] as String : null,
      login: map['login'] != null ? map['login'] as String : null,
      password: map['password'] != null ? map['password'] as String : null,
    );
  }

  String toJson() => json.encode(toMap());

  factory ItensModel.fromJson(String source) => ItensModel.fromMap(json.decode(source) as Map<String, dynamic>);

  @override
  String toString() {
    return 'ItensModel(id: $id, type: $type, service: $service, email: $email, login: $login, password: $password)';
  }
}

E esse Model

import 'dart:convert';

// ignore_for_file: public_member_api_docs, sort_constructors_first
class TypeModel {
  String? type;
  bool? visible;

  TypeModel({
    this.type,
    this.visible = false,
  });

  Map<String, dynamic> toMap() {
    return <String, dynamic>{
      'type': type,
      'visible': visible,
    };
  }

  factory TypeModel.fromMap(Map<String, dynamic> json) {
    return TypeModel(
      type: json['type'] != null ? json['type'] as String : null,
      visible: json['visible'] != null ? json['visible'] as bool : null,
    );
  }

  String toJson() => json.encode(toMap());

  factory TypeModel.fromJson(String source) => TypeModel.fromMap(json.decode(source) as Map<String, dynamic>);

  TypeModel.empty():
    type = '',
    visible = false;

  @override
  String toString() => 'TypeModel(type: $type, visible: $visible)';
}

Eu vou mostrar o conteúdo como lista e como agrupamento. Por isso do model para o "type", contendo o bool visible, a intenção é quando estiver no modo agrupamento, mostrar apenas os Type registrados, Exemplo: Cadastrei times de futebol e coloquei para mostrar por agrupamento de país, então devo ter: Argentina Brasil Paraguai

quando clico no país, terei a listagem referente aos times registrados desse país, exemplo: Cliquei na Argentina e terei Argentina -> Boca Juniors -> River Plate Brasil Paraguai

Agora que contextualizei a ideia, quando vou cadastrar informações, recebo o erro no campo type type 'String' is not a subtype of type 'Map<String, dynamic>'

Estou cadastrando informações de teste assim:

ItensModel i = ItensModel(
      id: 27,
      type: TypeModel(type: "Email"),
      service: "Gmail",
      email: "teste@teste.com",
      login: "teste",
      password: "12345",
  );

Agradeço qualquer ajuda que possa me direcionar, inclusive de alguma aula específica dentro da plataforma. Obrigado!!!

2 respostas

Oi Ricardo, tudo bem?

Como é um projeto pessoal e não conhecemos ele a fundo, te darei dica do que pode fazer.

Pelo que entendi, você está tentando criar uma instância do modelo ItensModel, e ao atribuir um valor para o campo type, que é do tipo TypeModel, você está recebendo o erro type 'String' is not a subtype of type 'Map<String, dynamic>'.

Isso acontece porque o Dart está esperando um Map<String, dynamic> onde você está passando uma String. Isso ocorre na linha onde você está tentando criar um novo TypeModel passando uma String diretamente.

O problema está aqui:

type: TypeModel(type: "Email"),

Aqui você está tentando passar uma String ("Email") para o campo type do TypeModel, mas o Dart espera um Map<String, dynamic>.

Uma maneira de fazer isso seria passar um Map<String, dynamic> para o método fromMap(), algo assim:

type: TypeModel.fromMap({"type": "Email", "visible": false}),

Neste exemplo, criamos um Map<String, dynamic> com os campos type e visible, e passamos para o método fromMap(). Isso deve resolver o problema que você está enfrentando.

Espero ter ajudado.

Um abraço e bons estudos.

Olá Lorena, boa tarde! Tudo bem? Você entendeu perfeitamente a questão.

Para desencargo de consciência, tentei novamente. Mas agradeço muito pela disponibilidade em tentar ajudar!