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

如何在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: "商品已添加到购物车");
}

关键说明

  1. 精准匹配:直接通过medicineID字段对比购物车中的每个商品,避免类型不匹配的检索错误
  2. 索引正确:使用找到的existingCartItem获取商品ID和当前数量,不会混淆activeMedicines与购物车列表的索引
  3. 空安全优化:如果你的项目开启了空安全,建议对onePharmacyModel、activeMedicines等对象添加更稳妥的空判断,避免!带来的潜在崩溃

内容的提问来源于stack exchange,提问作者Saayeed M Daawoud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:24:28