更新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
相关产品推荐
相关产品推荐

