【问题标题】:flutter how to convert a list in a map颤动如何转换地图中的列表
【发布时间】: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&lt;DateTime, List&lt;String&gt;&gt; 还是Map&lt;DateTime, String&gt;?您想对标记为 //this 的时间做什么?将它们添加到日期?您想如何处理每个事件都有开始和结束日期/时间的事实?您将日期地图发送到某个地方的实际要求是什么?

标签: flutter api calendar


【解决方案1】:

所以如果我理解正确,您有一个从 API 获取EventsModel 列表的方法,并且您想将其转换为Map&lt;DateTime, List&lt;String&gt;&gt; 类型的映射?如果是这种情况,您可以这样做:

Map<DateTime, List<String>> modelsToMap(List<EventsModel> models) {
  Map<DateTime, List<String>> 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;
}

【讨论】:

  • putIfAbsent 会更干净。当您尝试将add 指向一个空列表时,这将抛出一个空指针。
  • 对不起我的英语,我正在使用翻译器。非常感谢您的回答,但对我来说该方法不起作用。几天来,我一直在尝试通过 api 将事件添加到表日历中。 api返回我的模型列表,表日历收到一个地图,其键为dateTime类型,值为字符串,但我无法进行此转换
猜你喜欢
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2019-11-08
  • 1970-01-01
  • 2021-06-21
  • 2019-02-06
  • 2022-01-01
相关资源
最近更新 更多