【发布时间】:2021-12-22 04:22:21
【问题描述】:
请有人帮我转换一下这个模型:
import 'dart:convert';
class EventsModel {
final String descricaoJob;
final String dataDoJob;
final String horarioInicialDoJob;
final String horarioFinalDoJob;
EventsModel({
required this.descricaoJob,
required this.dataDoJob,
required this.horarioInicialDoJob,
required this.horarioFinalDoJob,
});
Map<String, dynamic> toMap() {
return {
'descricaoJob': descricaoJob,
'dataDoJob': dataDoJob,
'horarioInicialDoJob': horarioInicialDoJob,
'horarioFinalDoJob': horarioFinalDoJob,
};
}
factory EventsModel.fromMap(Map<String, dynamic> map) {
return EventsModel(
descricaoJob: map['descricao'],
dataDoJob: map['data_acao'],
horarioInicialDoJob: map['hora_inicial_acao'],
horarioFinalDoJob: map['hora_final_acao'],
);
}
String toJson() => json.encode(toMap());
factory EventsModel.fromJson(String source) => EventsModel.fromMap(json.decode(source));
}
在地图上,键是工作日期字段,值是工作描述字段,看起来像这样:
final events <Map<DateTime, List>> = {
dataDoJob: descricaoDoJob,
dataDoJob: descricaoDoJob,
}
这是我的 json,它有点大,但我需要标记的字段
[
{
"codigo_cupom": null,
"data_acao": "2021-07-11", //THIS
"deleted_at": null,
"descricao": "Teste de Job 1", //THIS
"hashtags": null,
"hora_final_acao": "12:00:00", //THIS
"hora_inicial_acao": "08:00:00", //THIS
"job": {
"canal_entrada": "Telefone",
"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-11",
"deleted_at": null,
"descricao": "Teste de Job",
"influenciador": {
"altura": null,
"avatar": null,
"busto_cms": null,
"calcinha_sunga_tamanho": null,
"casting_mailing": null,
"cidade": null,
"cidade_nascimento": null,
"cintura_cms": null,
"cnpj": null,
"cor_cabelo": null,
"cor_olhos": null,
"cpf": null,
"dados_bancarios_agencia": null,
"dados_bancarios_banco": null,
"dados_bancarios_conta": null,
"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": null,
"deleted_at": null,
"email": "ronaldinho@gaucho.com",
"email_responsavel_mailing": null,
"endereco": null,
"estado": null,
"estado_civil": null,
"estado_nascimento": null,
"etnia": null,
"filhos": null,
"formacao": null,
"frase_destaque": "Estão deixando a gente sonhar",
"influenciador_id": 20,
"last_modified_by": null,
"last_time": "2021-07-11T19:13:54+00:00",
"login_instagram": "ronaldinho",
"login_twitter": null,
"manequim_baixo": null,
"manequim_cima": null,
"marca_dedicada": null,
"nome": "Ronaldo",
"nome_artistico": "Ronaldinho Gaúcho",
"nome_responsavel_mailing": null,
"numero_sapato": null,
"numero_seguidores_instagram": 54396462,
"numero_soutien": null,
"percentual_comissao": null,
"periodo_dedicado": null,
"peso": null,
"pessoa_id": 20,
"pets": null,
"quadril_cms": null,
"razao_social": null,
"responsavel": 2,
"responsavel_id": 2,
"rg": null,
"sexo": "M",
"sobrenome": "de Assis Moreira",
"telefone": "(11) 99999-9999",
"telefone_responsavel_mailing": null,
"texto": null,
"tipo_cabelo": null,
"token_senha": null,
"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": 20,
"job_id": 1,
"last_modified_by": null,
"last_time": "2021-07-11T19:13:54+00:00",
"nota_fiscal": false,
"observacoes": "",
"participacao": 100,
"quantidade_posts": 1,
"quantidade_presencas": 1,
"quantidade_stories": 1,
"status": "nao_iniciado",
"tipo_demanda": "Espontâneo",
"valor": 1000.00
},
"job_acao_id": 1,
"job_id": 1,
"last_modified_by": null,
"last_time": "2021-07-11T19:13:54+00:00",
"link_produto": null,
"periodo": null,
"status": "nao_iniciada",
"tipo_acao": "Post",
"titulo": "Teste de Job 1",
"valor": 1000.00
},
{
"codigo_cupom": null,
"data_acao": "2021-10-29",
"deleted_at": null,
"descricao": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque gravida quam ut est posuere eleifend. In ac augue semper, sollicitudin nisl id, auctor lacus. Praesent faucibus eros condimentum elementum molestie. Fusce id eros enim. Cras sollicitudin lectus eu purus aliquam luctus.\n\nMaecenas tristique ultrices sem, quis commodo mauris egestas quis. In hac habitasse platea dictumst. Nunc maximus nisi a libero egestas, convallis aliquam urna vulputate. Vestibulum eget auctor ante, ornare mollis massa.",
"hashtags": "#ParquedoPovo #Run21 #MarcaX",
"hora_final_acao": "17:00:00",
"hora_inicial_acao": "15:00:00",
"job": {
"canal_entrada": null,
"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": null,
"deleted_at": null,
"descricao": "Fazer reels no parque do povo, usar roupas da marca com close no tênis.",
"influenciador": {
"altura": null,
"avatar": null,
"busto_cms": null,
"calcinha_sunga_tamanho": null,
"casting_mailing": null,
"cidade": null,
"cidade_nascimento": null,
"cintura_cms": null,
"cnpj": null,
"cor_cabelo": null,
"cor_olhos": null,
"cpf": null,
"dados_bancarios_agencia": null,
"dados_bancarios_banco": null,
"dados_bancarios_conta": null,
"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": null,
"deleted_at": null,
"email": "ronaldinho@gaucho.com",
"email_responsavel_mailing": null,
"endereco": null,
"estado": null,
"estado_civil": null,
"estado_nascimento": null,
"etnia": null,
"filhos": null,
"formacao": null,
"frase_destaque": "Estão deixando a gente sonhar",
"influenciador_id": 20,
"last_modified_by": null,
"last_time": "2021-07-11T19:13:54+00:00",
"login_instagram": "ronaldinho",
"login_twitter": null,
"manequim_baixo": null,
"manequim_cima": null,
"marca_dedicada": null,
"nome": "Ronaldo",
"nome_artistico": "Ronaldinho Gaúcho",
"nome_responsavel_mailing": null,
"numero_sapato": null,
"numero_seguidores_instagram": 54396462,
"numero_soutien": null,
"percentual_comissao": null,
"periodo_dedicado": null,
"peso": null,
"pessoa_id": 20,
"pets": null,
"quadril_cms": null,
"razao_social": null,
"responsavel": 2,
"responsavel_id": 2,
"rg": null,
"sexo": "M",
"sobrenome": "de Assis Moreira",
"telefone": "(11) 99999-9999",
"telefone_responsavel_mailing": null,
"texto": null,
"tipo_cabelo": null,
"token_senha": null,
"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": 20,
"job_id": 8,
"last_modified_by": 16,
"last_time": "2021-10-19T20:30:49+00:00",
"nota_fiscal": false,
"observacoes": null,
"participacao": 100,
"quantidade_posts": null,
"quantidade_presencas": null,
"quantidade_stories": null,
"status": "nao_iniciado",
"tipo_demanda": null,
"valor": 3000.00
},
"job_acao_id": 15,
"job_id": 8,
"last_modified_by": 16,
"last_time": "2021-10-19T20:30:49+00:00",
"link_produto": null,
"periodo": "Tarde",
"status": "nao_iniciada",
"tipo_acao": "Reels",
"titulo": "Parque do povo",
"valor": 3000.00
}
]
这是我访问 api 并获取数据的方法,我需要将它们转换为
@override
Future<List<EventsModel>> getEvents() async {
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
final int? id = sharedPreferences.getInt("idInfluencer");
final String token = sharedPreferences.getString("token") ?? "";
final Response result = await _restClient.get<List<EventsModel>>(
"/job_acoes?influenciador_id=${id.toString()}",
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer $token'
}, decoder: (data) {
if (data != null) {
return data.map<EventsModel>((event)=> EventsModel.fromMap(event)).toList();
}
return <EventsModel>[];
});
if (result.hasError) {
print(result.statusCode);
throw "Erro ao buscar dados";
}
print(result.body);
return result.body;
}
}
【问题讨论】:
-
您想要
Map<DateTime, List<String>>还是Map<DateTime, String>?您想对标记为 //this 的时间做什么?将它们添加到日期?您想如何处理每个事件都有开始和结束日期/时间的事实?您将日期地图发送到某个地方的实际要求是什么?