Flutter Dart:解决firstWhere仅返回首元素,获取列表所有匹配项
Flutter购物车多ProductQuantity实例列表修复方案
问题根源
firstWhere仅返回首个匹配元素,无法处理多ID商品场景,且未处理无匹配元素的异常情况- 循环赋值逻辑错误,重复修改同一实例而非新增/更新对应实例,导致最终列表仅保留最后一组数据
修复代码
1. 定义ProductQuantity模型类
class ProductQuantity { final String productId; final int quantity; ProductQuantity({required this.productId, required this.quantity}); // 转换为API所需的JSON格式 Map<String, dynamic> toJson() => { 'product_id': productId, 'quantity': quantity, }; }
2. 修复List扩展方法
extension ProductQuantityList on List<ProductQuantity> { void addOrUpdateProduct(String productId, int quantity) { try { // 查找已有商品实例 final existing = firstWhere((item) => item.productId == productId); // 移除旧实例,添加累加后的新实例(购物车通常需要累加数量) remove(existing); add(ProductQuantity( productId: productId, quantity: existing.quantity + quantity, )); } on StateError { // 无匹配实例时,直接添加新商品 add(ProductQuantity(productId: productId, quantity: quantity)); } } }
使用示例
void main() { final cart = <ProductQuantity>[]; // 添加不同商品及数量 cart.addOrUpdateProduct('prod_1001', 2); cart.addOrUpdateProduct('prod_1002', 1); cart.addOrUpdateProduct('prod_1001', 3); // 累加后数量变为5 // 生成API请求所需的JSON数组 final requestJson = cart.map((item) => item.toJson()).toList(); print(requestJson); }
目标JSON输出
[ {"product_id": "prod_1001", "quantity": 5}, {"product_id": "prod_1002", "quantity": 1} ]
关键修复说明
- 用
try-catch捕获firstWhere的无匹配异常,避免程序崩溃 - 针对购物车常见的"同商品数量累加"需求,通过移除旧实例、添加新实例的方式更新数量(若需替换数量,直接修改累加逻辑为
quantity即可) - 确保不同ID的商品都会生成独立的
ProductQuantity实例,最终列表包含多个有效数据
内容的提问来源于stack exchange,提问作者pythonGo
相关产品推荐
相关产品推荐

