Reputation: 316
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
Upvotes: 0
Views: 2269
Reputation: 1767
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"],
Upvotes: 2