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
方式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
相关产品推荐
相关产品推荐

