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

Flutter Dart:解决firstWhere仅返回首元素,获取列表所有匹配项

Flutter购物车多ProductQuantity实例列表修复方案

问题根源

  1. firstWhere仅返回首个匹配元素,无法处理多ID商品场景,且未处理无匹配元素的异常情况
  2. 循环赋值逻辑错误,重复修改同一实例而非新增/更新对应实例,导致最终列表仅保留最后一组数据

修复代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:33:57