Dart中如何访问嵌套对象列表里CareRequirement对应care_level的price值
解决方案
你可以通过Dart的集合查找方法嵌套筛选对应数据,以下是不同场景的实现方式:
基础实现(假设对应数据一定存在,无需异常处理)
你的careLevelsList当前存储的是Map类型数据,可直接通过键取值:
// 第一步:筛选id为1的CareRequirement对象 final targetReq = careRequirementsList.firstWhere((req) => req.id == 1); // 第二步:筛选care_level_id为1的项,取出price final targetPrice = (targetReq.careLevelsList.firstWhere((level) => level['care_level_id'] == 1))['price'];
执行后targetPrice的值就是你需要的2000.00。
安全优化版本(兼容数据缺失场景,避免运行崩溃)
如果存在找不到对应id的可能,可通过orElse参数处理异常场景:
double? targetPrice; // 查找目标护理要求 final targetReq = careRequirementsList.firstWhere( (req) => req.id == 1, orElse: () => CareRequirement.pure(), ); // 匹配到对应护理要求后再查找护理等级 if (targetReq.id != 0) { final targetLevel = targetReq.careLevelsList.firstWhere( (level) => level['care_level_id'] == 1, orElse: () => {}, ); if (targetLevel.isNotEmpty) { targetPrice = targetLevel['price'] as double; } }
最终如果targetPrice为null说明没有匹配到对应数据,不为空则是你需要的价格值。
可选优化:规范嵌套对象模型
当前careLevelsList是无类型List,容易出现类型错误,建议补充CareLevel模型做嵌套解析:
class CareLevel extends Equatable { final int careLevelId; final String careLevelName; final double price; const CareLevel({ required this.careLevelId, required this.careLevelName, required this.price, }); @override List<Object?> get props => [careLevelId, careLevelName, price]; factory CareLevel.fromJson(Map<String, dynamic> json) { return CareLevel( careLevelId: json['care_level_id'], careLevelName: json['care_level_name'], price: json['price'] as double, ); } Map<String, dynamic> toJson() { return { 'care_level_id': careLevelId, 'care_level_name': careLevelName, 'price': price, }; } }
修改CareRequirement中careLevelsList的类型定义和解析逻辑:
// 修改字段类型 List<CareLevel> careLevelsList = []; // 修改fromJson方法 CareRequirement.fromJson(Map<String, dynamic> json) { id = json['id']; name = json['name']; careLevelsList = (json['care_levels'] as List).map((e) => CareLevel.fromJson(e)).toList(); }
优化后可以直接通过对象属性取值,代码更易维护:
final targetReq = careRequirementsList.firstWhere((req) => req.id == 1); final targetPrice = targetReq.careLevelsList.firstWhere((level) => level.careLevelId == 1).price;
内容的提问来源于stack exchange,提问作者Kavishka Rajapakshe
相关产品推荐
相关产品推荐

