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

更新Map值时触发NoSuchMethodError且Map值为NULL的问题排查求助

问题分析与解决方案

错误根源

我一眼就揪出问题所在啦!你遇到的NoSuchMethodError: 'length' method not found. Receiver: null,核心原因是**List.add()方法没有返回值(返回类型是void)**。当你执行var list = dateToImages[d].add(_images[i]);时,list会被赋值为null,随后你把这个null重新赋值给dateToImages[d],这就导致最终Map里对应键的值变成了null,后续调用length自然就报错了。

修正后的代码

把循环里的赋值逻辑改成直接在原有列表上添加元素(因为List是引用类型,修改原列表会直接同步到Map中):

List<ImageDetails> _images = [
  ImageDetails(
    imagePath: 'assets/images/meal1.jpg',
    date: '2021-11-30',
    details: '',
  ),
  ImageDetails(
    imagePath: 'assets/images/meal2.jpg',
    date: '2021-11-30',
    details: '',
  ),
];
var dateToImages = new Map();
_images.sort((a,b) => a.date.compareTo(b.date));
//group images by date
for (int i = 0; i < _images.length; i++) {
  var d = _images[i].date;
  print("printing datetime in for loop");
  print(d);
  if (dateToImages.containsKey(d)) {
    print("second element");
    // 直接在原列表上添加元素,无需重新赋值
    dateToImages[d].add(_images[i]);
  } else {
    print("first element");
    dateToImages[d] = [_images[i]];
  }
}
var sortedKeys = dateToImages.keys.toList()..sort((a, b) => a.compareTo(b));
List<Widget> children = [];
print("=====printing datetoImages");
print(dateToImages);
print("======== printing sortedKeys");
print(sortedKeys);
int len = dateToImages['2021-11-30'].length;

额外优化建议

如果你不想手动写循环分组,也可以用Dart官方的collection包简化代码,让逻辑更清晰:

import 'package:collection/collection.dart';

// 一行代码完成分组
var dateToImages = groupBy(_images, (ImageDetails img) => img.date);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:54:10