如何为Map<DateTime, List<dynamic>>动态添加列表并解决空指针报错
代码问题排查与修正方案
核心问题定位
- 报错直接诱因:代码引用的
myMap未完成初始化,默认为null。当代码执行myMap[dateFormatted] = []时,实际是在null对象上调用[]=赋值方法,完全匹配报错日志中“Receiver: null”的堆栈信息 - 循环逻辑漏洞:原代码仅在
i==0分支下为对应键创建空列表,如果后续遍历的元素经过_formatDate处理后得到的时间值和首元素不同,Map中没有对应键值,调用myMap[dateFormatted].add()时会再次触发空指针 - 变量引用错误:循环内读取条目名称时,误将入参
list写为当前作用域未定义的events变量,运行时会触发未定义标识符异常 - 分支逻辑错位:单元素判断分支中,直接对List类型的入参执行
list['date']取值,但List结构需通过数字索引访问元素,此处会触发类型不匹配异常
修正后可运行的代码实现
Map formatMap(List<Map<String, dynamic>> list) { // 方法内部独立初始化Map,避免依赖外部未赋值的全局变量 final Map<DateTime, List<Map<String, dynamic>>> myMap = {}; // 统一遍历所有元素,无需单独拆分单元素分支,减少重复逻辑 for (int i = 0; i < list.length; i++) { final currentItem = list[i]; final DateTime dateFormatted = _formatDate(currentItem['date']); // 遍历到任意元素时,先校验Map中是否存在对应键,不存在则初始化为空列表 myMap[dateFormatted] ??= []; // 将当前条目加入对应日期的列表 myMap[dateFormatted]!.add({ 'date': currentItem['date'], 'name': currentItem['name'] }); } return myMap; }
预期效果调整说明
如果需要达成你给出的Map结构(所有原始条目都归到同一个格式化UTC时间的键下),只需调整_formatDate方法的内部逻辑,保证任意输入的原始日期字符串都返回你指定的统一UTC时间对象即可,无需改动遍历归集的主流程。
内容的提问来源于stack exchange,提问作者HelloWorldd
相关产品推荐
相关产品推荐

