#flutter #api #calendar
Вопрос:
пожалуйста, кто-нибудь может мне помочь, мне нужно преобразовать эту модель:
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, }); Maplt;String, dynamicgt; toMap() { return { 'descricaoJob': descricaoJob, 'dataDoJob': dataDoJob, 'horarioInicialDoJob': horarioInicialDoJob, 'horarioFinalDoJob': horarioFinalDoJob, }; } factory EventsModel.fromMap(Maplt;String, dynamicgt; map) { return EventsModel( descricaoJob: map['descricao'], dataDoJob: map['data_acao'], horarioInicialDoJob: map['hora_inicial_acao'], horarioFinalDoJob: map['hora_final_acao'], ); } String toJson() =gt; json.encode(toMap()); factory EventsModel.fromJson(String source) =gt; EventsModel.fromMap(json.decode(source)); }
на карте, где ключом является поле даты задания, а значением-поле описания задания, выглядит примерно так:
final events lt;Maplt;DateTime, Listgt;gt; = { 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.nnMaecenas 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 и получении данных, мне нужно преобразовать их в lt;Картаlt;Дата-время, списокgt;lt;Дата-время, списокgt;gt;, чтобы иметь возможность использовать его в табличном календаре, если кто-то может мне помочь, я очень благодарен
@override Futurelt;Listlt;EventsModelgt;gt; getEvents() async { SharedPreferences sharedPreferences = await SharedPreferences.getInstance(); final int? id = sharedPreferences.getInt("idInfluencer"); final String token = sharedPreferences.getString("token") ?? ""; final Response result = await _restClient.getlt;Listlt;EventsModelgt;gt;( "/job_acoes?influenciador_id=${id.toString()}", headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': 'Bearer $token' }, decoder: (data) { if (data != null) { return data.maplt;EventsModelgt;((event)=gt; EventsModel.fromMap(event)).toList(); } return lt;EventsModelgt;[]; }); if (result.hasError) { print(result.statusCode); throw "Erro ao buscar dados"; } print(result.body); return result.body; } }
Комментарии:
1. Ты хочешь а
Maplt;DateTime, Listlt;Stringgt;gt;
или аMaplt;DateTime, Stringgt;
? Что вы хотите сделать со временем, которое вы отметили как //это? Добавить их к дате? Как вы хотите справиться с тем фактом, что каждое событие имеет дату/время начала и окончания? Каковы фактические требования к тому, куда вы отправляете карту дат для чего-то?
Ответ №1:
Итак, если я правильно понимаю, у вас есть метод, который извлекает список EventsModel
из API, и вы хотите превратить его в карту типа Maplt;DateTime, Listlt;Stringgt;gt;
? Если это так, вы можете сделать что-то вроде этого:
Maplt;DateTime, Listlt;Stringgt;gt; modelsToMap(Listlt;EventsModelgt; models) { Maplt;DateTime, Listlt;Stringgt;gt; map = {}; for (model in models) { DateTime time = DateTime.parse(model.dataDoJob); if (map.containsKey(time)) { map[time].add(model.descricaoDoJob); } else { map[time] = [model.descricaoDoJob]; } } return map; }
Комментарии:
1.
putIfAbsent
было бы чище. Это приведет к появлению нулевого указателя при попытке перейтиadd
к нулевому списку.2. извините за мой английский, я пользуюсь переводчиком. Большое вам спасибо за ответ, но для меня этот метод не сработал. Я уже несколько дней пытаюсь добавить события в настольный календарь с помощью api. Api возвращает список моей модели, а настольный календарь получает карту с ключом типа DateTime и значением в виде строки, но я не могу выполнить это преобразование