Search code examples
flutterapiget

Flutter NoSuchMethodError: The method '[]' was called on null. how to solve this error when giving get in an api using flutter


I have a problem consuming an api via get method. Apparently the error is in the mapping of my model, but at least for me the model is ok. If someone can help me, I would be grateful.

that's my method, i'm using get connect to access the api. _restClient refers to my base url.

class ActionPageRepositoryImpl implements ActionPageRepository {
  final RestClient _restClient;

  ActionPageRepositoryImpl({required RestClient restClient})
      : _restClient = restClient;

  @override
  Future<ActionPageModel> getActionPageJobs(int id) async {
    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();

    final String token = sharedPreferences.getString("token") ?? "";

    final Response result =
        await _restClient.get<ActionPageModel>("/job_acoes/$id", headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
      'Authorization': 'Bearer $token'
    }, decoder: (data) {
      if (data != null) {
        print("status codeData ${data}");
        return ActionPageModel.fromMap(data);
      }
      return ActionPageModel.fromMap(data);
    });
    if (result.hasError) {
      print("status codeError ${result.statusCode}");
      throw ("erro ao buscar dados");
    }

    print("status codeBody ${result.body}");
    print("Status codeSucess ${result.statusCode}");

    return result.body ?? "";
  }
}

this is my print of data in this get method, apparently he's not giving me the full json feedback from the api, but why?

status codeData {codigo_cupom: null, data_acao: 2021-07-26, deleted_at: null, descricao: Um Story, hashtags: null, hora_final_acao: 12:00:00, hora_inicial_acao: 08:00:00, job: {canal_entrada: E-Mail, cliente: {cidade: Portland, cliente_id: 1, cnpj: 12.345.678/0001-12, deleted_at: null, descricao: Nike, endereco: 1 Nike Drive, estado: SP, last_modified_by: null, last_time: 2021-07-11T19:13:54+00:00, login_instagram: nike, nome: Nike, nota_fiscal: null, numero_seguidores_instagram: null, observacoes: null, razao_social: Nike Inc, telefone_comercial: (11) 1111-1111, website: https://nike.com}, cliente_id: 1, data_inicio: 2021-07-24, deleted_at: null, descricao: Mais um teste, influenciador: {altura: null, avatar: pessoas/21/avatar.png, busto_cms: null, calcinha_sunga_tamanho: null, casting_mailing: null, cidade: null, cidade_nascimento: null, cintura_cms: null, cnpj: 27179660000138, cor_cabelo: null, cor_olhos: null, cpf: 048.677.923-81, dados_bancarios_agencia: 1322, dados_bancarios_banco: 12, dados_bancarios_

this is my model

class ActionPageModel {
  String influencerNome;
  String sobreNome;
  String descricaoJob;
  String nome;
  String dataDoJob;
  String horarioDoJob;
  String briefing;
  String site;
  String hashTag;
  String cupom;
  ActionPageModel({
    required this.influencerNome,
    required this.sobreNome,
    required this.descricaoJob,
    required this.nome,
    required this.dataDoJob,
    required this.horarioDoJob,
    required this.briefing,
    required this.site,
    required this.hashTag,
    required this.cupom,
  });
  

  Map<String, dynamic> toMap() {
    return {
      'influencerNome': influencerNome,
      'sobreNome': sobreNome,
      'descricaoJob': descricaoJob,
      'nome': nome,
      'dataDoJob': dataDoJob,
      'horarioDoJob': horarioDoJob,
      'briefing': briefing,
      'site': site,
      'hashTag': hashTag,
      'cupom': cupom,
    };
  }

  factory ActionPageModel.fromMap(Map<String, dynamic> map) {
    return ActionPageModel(
      influencerNome: map["influenciador"]["nome"],
      sobreNome: map['influenciador']["sobrenome"],
      descricaoJob: map['job']["cliente"]["descricao"] ?? "",
      nome: map['job']["cliente"]['nome'] ?? "",
      dataDoJob: map['data_acao'] ?? "",
      horarioDoJob: map['hora_inicial_acao'] ?? "",
      briefing: map['descricao'] ?? "", //!FICAR DE OLHO NESSE CAMPO,
      site: map['job']["cliente"]["website"] ?? "",
      hashTag: map['hashtags'] ?? "",
      cupom: map['codigo_cupom'] ?? "",
    );
  }

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

  factory ActionPageModel.fromJson(String source) => ActionPageModel.fromMap(json.decode(source));
}

and this is json, it's quite long but I marked with this the areas I need to get the data

{
    "codigo_cupom": null, //THIS
    "data_acao": "2021-07-26", //THIS
    "deleted_at": null,
    "descricao": "Um Story",
    "hashtags": null,
    "hora_final_acao": "12:00:00",
    "hora_inicial_acao": "08:00:00", //THIS
    "job": {
        "canal_entrada": "E-Mail",
        "cliente": {
            "cidade": "Portland",
            "cliente_id": 1,
            "cnpj": "12.345.678/0001-12",
            "deleted_at": null,
            "descricao": "Nike", //THIS
            "endereco": "1 Nike Drive",
            "estado": "SP",
            "last_modified_by": null,
            "last_time": "2021-07-11T19:13:54+00:00",
            "login_instagram": "nike",
            "nome": "Nike", //THIS
            "nota_fiscal": null,
            "numero_seguidores_instagram": null,
            "observacoes": null,
            "razao_social": "Nike Inc",
            "telefone_comercial": "(11) 1111-1111",
            "website": "https://nike.com" //THIS
        },
        "cliente_id": 1,
        "data_inicio": "2021-07-24",
        "deleted_at": null,
        "descricao": "Mais um teste",
        "influenciador": {
            "altura": null,
            "avatar": "pessoas/21/avatar.png",
            "busto_cms": null,
            "calcinha_sunga_tamanho": null,
            "casting_mailing": null,
            "cidade": null,
            "cidade_nascimento": null,
            "cintura_cms": null,
            "cnpj": "27179660000138",
            "cor_cabelo": null,
            "cor_olhos": null,
            "cpf": "048.677.923-81",
            "dados_bancarios_agencia": 1322,
            "dados_bancarios_banco": 12,
            "dados_bancarios_conta": "0283614-9",
            "dados_bancarios_pf_chave_pix": null,
            "dados_bancarios_pf_cpf": null,
            "dados_bancarios_pf_nome": null,
            "dados_bancarios_pj_agencia": null,
            "dados_bancarios_pj_banco": null,
            "dados_bancarios_pj_chave_pix": null,
            "dados_bancarios_pj_conta": null,
            "data_nascimento": "1987-11-25",
            "deleted_at": null,
            "email": "[email protected]",
            "email_responsavel_mailing": null,
            "endereco": "R SANTA JUSTINA 411, APTO 36           ",
            "estado": null,
            "estado_civil": null,
            "estado_nascimento": null,
            "etnia": null,
            "filhos": null,
            "formacao": null,
            "frase_destaque": "Minha frase de destaque",
            "influenciador_id": 21,
            "last_modified_by": 21,
            "last_time": "2021-10-30T16:36:34+00:00",
            "login_instagram": "instagram",
            "login_twitter": null,
            "manequim_baixo": 40,
            "manequim_cima": 38,
            "marca_dedicada": null,
            "nome": "Isabela", //THIS
            "nome_artistico": "Influenciador Teste",
            "nome_responsavel_mailing": null,
            "numero_sapato": null,
            "numero_seguidores_instagram": 404000000,
            "numero_soutien": null,
            "percentual_comissao": null,
            "periodo_dedicado": null,
            "peso": null,
            "pessoa_id": 21,
            "pets": null,
            "quadril_cms": null,
            "razao_social": null,
            "responsavel": 3,
            "responsavel_id": 3,
            "rg": "26.108.098-2",
            "sexo": "M",
            "sobrenome": "Soller", //THIS
            "telefone": "(11) 9999-9999",
            "telefone_responsavel_mailing": null,
            "texto": null,
            "tipo_cabelo": null,
            "token_senha": "9738873473ADFD6464169415AA5CB4E1E39982E2E90F11D37E8B9383FE72040B6452C98774CB0E7B",
            "url": null,
            "url_facebook": null,
            "url_media_kit": null,
            "url_youtube": null,
            "valor_pacote_fotos": 0.00,
            "valor_post": 0.00,
            "valor_post_facebook": 0.00,
            "valor_post_stories": 0.00,
            "valor_presenca": 0.00,
            "valor_shooting": 0.00,
            "valor_stories": 0.00,
            "valor_take_over": 0.00,
            "valor_video": 0.00,
            "valor_youtube": 0.00
        },
        "influenciador_id": 21,
        "job_id": 3,
        "last_modified_by": 1,
        "last_time": "2021-07-20T22:35:27+00:00",
        "nota_fiscal": false,
        "observacoes": null,
        "participacao": 100,
        "quantidade_posts": 1,
        "quantidade_presencas": 1,
        "quantidade_stories": 1,
        "status": "nao_iniciado",
        "tipo_demanda": "Espontâneo",
        "valor": 9000.00
    },
    "job_acao_comunicacoes": [],
    "job_acao_id": 4,
    "last_modified_by": 1,
    "last_time": "2021-07-20T22:35:27+00:00",
    "link_produto": null,
    "periodo": "Manhã",
    "status": "nao_iniciada",
    "tipo_acao": "Story",
    "titulo": "Um Story",
    "valor": 3000.00
}

this is my error cath by printing stacktrace.

I/flutter ( 2931): NoSuchMethodError: The method '[]' was called on null.
I/flutter ( 2931): Receiver: null
I/flutter ( 2931): Tried calling: []("nome")
I/flutter ( 2931): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:63:5)
I/flutter ( 2931): #1      new ActionPageModel.fromMap
package:soller_acessoria_new_app_nullsafety/…/actionPageModel/action_page_model.dart:45
I/flutter ( 2931): #2      ActionPageRepositoryImpl.getActionPageJobs.<anonymous closure>
package:soller_acessoria_new_app_nullsafety/…/actionPage/action_page_repository_impl.dart:28
I/flutter ( 2931): #3      bodyDecoded
package:get/…/utils/body_decoder.dart:28
I/flutter ( 2931): #4      HttpRequestImpl.send
package:get/…/io/http_request_io.dart:60
I/flutter ( 2931): <asynchronous suspension>
I/flutter ( 2931): #5      GetHttpClient._performRequest
package:get/…/src/http.dart:209
I/flutter ( 2931): <asynchronous suspension>
I/flutter ( 2931): #6      GetHttpClient.get
package:get/…/src/http.dart:455
I/flutter ( 2931): <asynchronous suspension>
I/flutter ( 2931): #7      ActionPageRepositoryImpl.getActionPageJobs
package:soller_acessoria_new_app_nullsafety/…/actionPage/action_page_repository_impl.dart:21
I/flutter ( 2931): <asynchronous suspension>
I/flutter ( 2931): #8      AcaoController.o

Solution

  • Does line 45 in action_page_model correspond to this code?

      influencerNome: map["influenciador"]["nome"],
    

    If yes, the problem is that influenciador is a nested property of job, so you receive a null value on it, because it does not exist as a key in your map. Then, on this null value you are calling ["nome"], hence getting the error.

    Solution should be:

      influencerNome: map["job"]["influenciador"]["nome"],