You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter/Dart:如何将对象列表转为Map?解决键访问类型错误

问题解决:将List转换为单一Map<DateTime, List>

问题根源

你当前的代码通过map()+toList()生成的是包含多个独立小Map的List(类型为List<Map<DateTime, List<Slot>>>)。List只能用整数索引访问,所以直接调用mapped[date]会触发类型错误;而mapped[0][date]能正常工作,是因为先通过整数索引拿到了列表里的某个小Map,再用DateTime访问该Map的键。

解决方案:合并为单一Map

直接将List中的所有条目合并到一个全局Map中,推荐两种实现方式:

方式1:使用fold(更简洁的函数式写法)

var mapped = <DateTime, List<Slot>>{};
List<Slots>? data = controller.slots;

if (data != null) {
  mapped = data.fold<Map<DateTime, List<Slot>>>({}, (result, item) {
    final dateKey = DateTime.parse(item.date!);
    // 处理空安全:已有日期则追加slot,无则初始化列表
    result[dateKey] = [...?result[dateKey], ...item.slot!];
    return result;
  });
}

方式2:使用forEach遍历构建(更直观的命令式写法)

var mapped = <DateTime, List<Slot>>{};
List<Slots>? data = controller.slots;

data?.forEach((item) {
  final dateKey = DateTime.parse(item.date!);
  if (mapped.containsKey(dateKey)) {
    mapped[dateKey]!.addAll(item.slot!);
  } else {
    mapped[dateKey] = item.slot!;
  }
});

验证使用

此时mapped的类型为Map<DateTime, List<Slot>>,你的_getEventsfromDay函数可以直接正常调用:

List<dynamic> _getEventsfromDay(DateTime date) {
  print(mapped);
  return mapped[date] ?? [];
}

额外提醒

  • 确保item.date不为null,否则DateTime.parse会抛出异常,建议根据业务场景添加空值兜底逻辑
  • 若item.slot可能为null,需用...?或空判断避免空指针问题

内容的提问来源于stack exchange,提问作者Venkat Cpr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:01:26