如何在List<Map>中通过medicineID判断商品并实现购物车逻辑?
修正后的购物车商品判断与处理逻辑
原代码的核心问题在于检索逻辑错误:你将购物车项转换为包含medicine_id的Map列表后,用contains传入一个int类型的medicineID,这永远无法匹配(因为列表元素是Map,不是单个数值);另外更新时误用了activeMedicines的索引,会导致修改错误的购物车商品。
以下是正确的实现方式:
步骤1:获取目标商品的medicineID
先提取当前要添加的商品的medicineID,方便后续检索:
final targetMedicineId = cubit.onePharmacyModel!.data!.activeMedicines![index].id!.toInt();
步骤2:检索购物车中是否存在该商品
使用firstWhereOrNull(需导入package:collection/collection.dart)精准匹配购物车中的商品,找到对应项:
// 查找购物车中是否已有相同medicineID的商品 final existingCartItem = cubit.myItems.firstWhereOrNull( (item) => item['medicineID'] == targetMedicineId );
步骤3:根据检索结果处理
- 若找到已有商品:更新其数量并调用数据库更新接口
- 若未找到:插入新商品到数据库
if (existingCartItem != null) { // 计算更新后的数量 final updatedQuantity = existingCartItem['quantity'] + 1; // 调用更新接口,传入正确的商品ID和新数量 cubit.updateQuery( updatedQuantity, existingCartItem['id'], cubit.onePharmacyModel!.data!.id!.toInt() ); Fluttertoast.showToast(msg: "购物车已更新"); } else { // 插入新商品到数据库 cubit.insertToDatabase( title: cubit.onePharmacyModel!.data!.activeMedicines[index].name.toString(), price: cubit.onePharmacyModel!.data!.activeMedicines[index].pivot!.price!.toString(), image: cubit.onePharmacyModel!.data!.activeMedicines[index].photo.toString(), quantity: 1, pharmacyID: cubit.onePharmacyModel!.data!.id!.toInt(), medicineID: targetMedicineId ); Fluttertoast.showToast(msg: "商品已添加到购物车"); }
关键说明
- 精准匹配:直接通过
medicineID字段对比购物车中的每个商品,避免类型不匹配的检索错误 - 索引正确:使用找到的
existingCartItem获取商品ID和当前数量,不会混淆activeMedicines与购物车列表的索引 - 空安全优化:如果你的项目开启了空安全,建议对
onePharmacyModel、activeMedicines等对象添加更稳妥的空判断,避免!带来的潜在崩溃
内容的提问来源于stack exchange,提问作者Saayeed M Daawoud
相关产品推荐
相关产品推荐

