Flutter购物车更新商品数量时触发JSON空文档解析错误
购物车更新数量时JSON解析空错误的排查与修复
1. 先解决数据类型混乱的隐患
你的代码里存在价格类型不统一的问题,这很可能是引发后续错误的根源:
- 在
addToCart中,price和total直接取productsList里的sale_price,如果这个值是字符串类型,后续updateQuantity里的double.parse能正常工作;但如果是数字类型(int/double),double.parse会直接报错,甚至导致JSON序列化时出现异常。 - 修复方式:在添加商品时就统一把价格转成double存储:
addToCart(int index) async { // 先统一转换价格类型,避免后续解析错误 final salePrice = double.parse(productsList[index]['sale_price'].toString()); Map data = { "product_name": productsList[index]['english_name'], "price": salePrice, "qty": 1, "total": salePrice, }; cartProducts.add(data); countTotalPrice(); update(); }
2. 优化更新数量的逻辑
updateQuantity里直接用double.parse(data['price'])存在风险,既然已经统一了价格类型,直接用类型转换更安全:
updateQuantity(index, count) { final product = cartProducts[index]; product['qty'] = count; // 直接用已存储的double类型价格计算 product['total'] = (product['price'] as double) * count; countTotalPrice(); update(); }
3. 定位JSON空文档的核心原因
错误Unable to parse JSON message: The document is empty本质是发送HTTP请求时请求体为空,和当前本地计算逻辑关联不大,建议排查:
- 提交购物车数据到后端的代码,确认是否正确序列化了
cartProducts,有没有出现数据为空的情况; - 打印
cartProducts的内容,检查更新数量后数据是否正常,有没有空字段导致JSON序列化失败; - 核对后端接口的参数要求,确保必填字段都已正确传入。
4. 简化总价计算的代码
countTotalPrice里的循环可以用fold简化,同时增加类型检查避免强制转换报错:
void countTotalPrice() { // 这里不需要async,没有异步操作 totalPrice = cartProducts.fold(0.0, (sum, item) { final total = item['total']; // 兼容int/double类型,避免转换失败 return sum + (total is double ? total : (total is int ? total.toDouble() : 0.0)); }); update(); }
内容的提问来源于stack exchange,提问作者Swapnil Mane
相关产品推荐
相关产品推荐

