You need to enable JavaScript to run this app. 如何为Map<DateTime, List<dynamic>>动态添加列表并解决空指针报错
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 05:24:10