Flutter实现购物车+/-按钮增减商品数量遇空安全报错
报错根因
该报错是Dart空安全机制的校验拦截:你定义的ProductModel类中quantity字段被声明为可空类型int?,直接对可能为null的字段执行+=/-=算术运算时,Dart无法确认接收者非空,就会抛出该提示。
修复步骤
- 优先从数据定义层解决问题:将
ProductModel中的quantity字段改为非空int类型,设置默认值0,符合商品数量不可能为null的业务逻辑,从根源规避空安全问题 - 优化原有增减逻辑:原代码中修改数量前先移除商品、修改后再插回列表的操作是冗余的,只要是同一对象引用,直接修改列表内对应元素的quantity属性即可同步生效
- 数量减到1时再触发减操作,可直接移除对应商品,符合常规购物车交互逻辑
修正后代码
首先调整ProductModel的字段定义:
class ProductModel { // 其他业务字段按需保留 int quantity; ProductModel({ // 其他构造参数 this.quantity = 0, }); }
对应数量增减方法实现:
void addToCart(ProductModel product) { if (cartItems.contains(product)) { int index = cartItems.indexOf(product); cartItems[index].quantity += 1; } else { product.quantity = 1; cartItems.add(product); } // 若使用setState/Provider等状态管理,此处记得触发UI刷新 } void decreaseQuantity(ProductModel product) { if (!cartItems.contains(product)) return; int index = cartItems.indexOf(product); if (cartItems[index].quantity <= 1) { cartItems.removeAt(index); } else { cartItems[index].quantity -= 1; } // 此处同样记得触发UI刷新 }
特殊场景说明:如果业务上
quantity确实需要保留可空类型,运算时需要先做空值兜底,例如product.quantity = (product.quantity ?? 0) + 1;,但该方案不符合购物车数量的业务属性,不推荐使用。
内容的提问来源于stack exchange,提问作者Binu Das
相关产品推荐
相关产品推荐

