flutter 如何转换地图中的列表

flutter how to convert a list in a map

有人可以帮助我吗我需要转换这个模型:

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 并获取数据的方法,我需要将它们转换为 > 才能在 table 中使用它日历,如果有人能帮助我,我真的很感激

 @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;
  }
}

所以如果我理解正确的话,你有一个方法可以从 API 中获取 EventsModel 的列表,你想把它变成 Map<DateTime, List<String>> 类型的映射?如果是这样,您可以这样做:

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;
}