Dart/Flutter技术问题:如何访问列表中Map的元素值?
解决Dart/Flutter中列表内Map元素的访问问题
嘿,我来帮你搞定这个问题!你碰到的报错根源其实是一个小语法错误,再结合Dart的类型机制,咱们一步步解决:
直接报错原因:多了个多余的.
你写的myPODO.rooms[1].['roomBeds']里,[]前面的那个.是完全多余的!Dart里访问Map的键值对,正确的写法是map[key],不需要在Map对象和[]之间加.。
错误写法:
myPODO.rooms[1].['roomBeds'] // 这里的 . 是问题所在!
基础修复:修正语法
直接去掉那个多余的.,就能正常访问了:
var bedCount = myPODO.rooms[1]['roomBeds'];
更安全的类型化访问(推荐)
如果你的myPODO.rooms是List<dynamic>类型(也就是没有明确声明元素是Map),为了避免运行时可能出现的类型错误,建议先做类型检查和转换:
// 先确认第2个元素是Map类型 if (myPODO.rooms[1] is Map<String, dynamic>) { // 转换为明确的Map类型后再访问键 var bedCount = (myPODO.rooms[1] as Map<String, dynamic>)['roomBeds']; // 接下来就可以放心使用bedCount啦 }
最佳实践:用强类型类替代原始Map
既然你提到了myPODO,说明你已经在尝试用面向对象的方式处理数据,那不如更进一步,给房间定义一个强类型的类,彻底摆脱Map键名拼写错误和类型不安全的问题:
// 定义Room类,把每个字段都明确类型 class Room { final int roomNumber; final int roomBeds; final int roomColor; final int roomNumOfDwellers; final List<dynamic> roomDwellers; Room({ required this.roomNumber, required this.roomBeds, required this.roomColor, required this.roomNumOfDwellers, required this.roomDwellers, }); // 从Map转换为Room对象的工厂方法 factory Room.fromMap(Map<String, dynamic> map) { return Room( roomNumber: map['roomNumber'] as int, roomBeds: map['roomBeds'] as int, roomColor: map['roomColor'] as int, roomNumOfDwellers: map['roomNumOfDwellers'] as int, roomDwellers: map['roomDwellers'] as List<dynamic>, ); } } // 更新你的MyPODO类,让rooms变成List<Room>类型 class MyPODO { final List<Room> rooms; MyPODO({required this.rooms}); // 从原始的Map数据生成MyPODO对象 factory MyPODO.fromMap(Map<String, dynamic> map) { var roomsList = (map['rooms'] as List) .map((roomMap) => Room.fromMap(roomMap as Map<String, dynamic>)) .toList(); return MyPODO(rooms: roomsList); } }
这样改造后,你就可以用更直观的点语法访问属性,IDE还会给你代码提示,再也不用担心键名写错:
// 强类型访问,安全又方便 var bedCount = myPODO.rooms[1].roomBeds;
再解释下报错信息
你看到的Class '_InternalLinkedHashMap' has no instance getter 'roomBeds',是因为错误的.语法让Dart以为你要调用Map对象的roomBeds getter方法(就像访问类的属性那样),但Map根本没有这个方法,只有通过[]传键的方式才能获取对应的值。
内容的提问来源于stack exchange,提问作者Aleksander Barsukov
相关产品推荐
相关产品推荐

