for循环未遵循if条件:购物车商品重复添加与增量问题排查
问题修复方案
问题描述
处理三个列表:存储原始值的列表table!.items、待添加/更新的列表cart、存储新值的列表newItems。预期逻辑是:若cart中的元素已在原始列表中存在,仅增量该商品数量;若不存在,则加入newItems,最后将newItems合并到原始列表。但现有函数同时执行了增量和添加新元素的操作,逻辑失效。
原始代码
void addToTable(List<CartProduct> cart) { if (table!.items!.isNotEmpty) { for (int i = 0; i < table!.items!.length; i++) { final CartProduct cartProduct = table!.items![i]; for (var element in cart) { if (element.productId == cartProduct.productId) { cartProduct.increment(); } else { newItems!.add(element); } } } table!.items!.addAll(newItems!); newItems!.clear(); saveTableOrder(); notifyListeners(); } else { table!.items!.addAll(cart); saveTableOrder(); } }
问题根源
- 嵌套循环逻辑错误:遍历原始列表的每个元素时,会和
cart的所有元素逐一对比。只要某对元素ID不匹配,就把cart元素加入newItems——这会导致同一个cart元素被多次添加到newItems(比如原始列表有3个元素,cart元素和其中2个不匹配,就会被加2次)。 - 存在性判断逻辑颠倒:应该以
cart元素为核心,检查它是否在原始列表中存在,而不是用原始列表元素去遍历cart。
修复后的代码
void addToTable(List<CartProduct> cart) { if (table!.items!.isNotEmpty) { // 先清空newItems,避免残留旧数据 newItems!.clear(); // 遍历待添加的每个cart元素 for (var element in cart) { // 检查当前cart元素是否已在原始列表中存在 final existingProduct = table!.items!.firstWhere( (product) => product.productId == element.productId, orElse: () => null, ); if (existingProduct != null) { // 存在则执行增量操作 existingProduct.increment(); } else { // 不存在则加入newItems newItems!.add(element); } } // 将新元素合并到原始列表 table!.items!.addAll(newItems!); saveTableOrder(); notifyListeners(); } else { // 原始列表为空时直接添加所有cart元素 table!.items!.addAll(cart); saveTableOrder(); } }
修复说明
- 以
cart元素为遍历主体,对每个元素单独判断是否存在于原始列表,避免重复添加。 - 使用
firstWhere快速查找匹配元素,逻辑更简洁高效。 - 操作前先清空
newItems,防止之前的残留数据干扰结果。
内容的提问来源于stack exchange,提问作者Ricardo Oscar Kanitz
相关产品推荐
相关产品推荐

