Xamarin购物车开发:点击加购时校验商品是否存在并更新数量
问题原因
- 逻辑顺序错误:遍历购物车商品时,每遇到一个不匹配ID的商品就立即添加新商品写入Preferences,不仅会导致新商品重复添加,还会提前打乱后续逻辑,就算后面碰到匹配ID的商品也不会执行数量更新操作。
- 原有购物车数据丢失:你始终操作的是新初始化的空
data列表,没有将本地已存储的购物车商品列表同步到操作对象中,写入Preferences时直接覆盖原有数据,导致旧商品全部丢失。 - 修改后的数据未持久化:就算匹配到相同ID的商品、修改了购买数量,也没有将修改后的购物车列表重新序列化存入Preferences,改动不会生效。
- 未提前判断商品是否存在:在遍历前没有先判断当前商品是否已在购物车中,遍历过程中直接分支处理,逻辑完全混乱。
修复后的完整代码
var getprd = ((ViewProductViewModel)BindingContext).ProductInfo; int idprod = getprd.IDProduct; string nameprod = getprd.Name; Int64 priceprod = getprd.Price; Int64 priceoldprod = getprd.PriceOld; string imgprod = getprd.Images; // 先读取本地已有的购物车数据,不要直接新建空列表 List<CartUser> cartList; var addcart = Preferences.Get("CartUser", "defaultcart"); if (addcart != "defaultcart") { cartList = JsonConvert.DeserializeObject<List<CartUser>>(addcart); } else { cartList = new List<CartUser>(); } // 查找是否已存在相同ID的商品 var existProduct = cartList.FirstOrDefault(p => p.IDProduct == idprod); if (existProduct != null) { // 已存在,数量+1 existProduct.NumberProduct += 1; } else { // 不存在,新增商品 var productInfoget = new CartUser() { IDProduct = idprod, NameProduct = nameprod, PriceProduct = priceprod, PriceProductOld = priceoldprod, ImagesProduct = imgprod, NumberProduct = 1 }; cartList.Add(productInfoget); } // 统一将修改后的购物车列表写入Preferences Preferences.Set("CartUser", JsonConvert.SerializeObject(cartList));
核心改动说明
- 优先读取本地已存储的购物车列表作为操作基础,避免原有商品数据丢失。
- 先遍历查找匹配ID的商品,判断完成后再统一处理是更新数量还是新增商品,不会出现遍历中重复操作的问题。
- 所有改动都在同一个购物车列表上完成,最后统一做一次持久化写入,逻辑清晰且不会出现写入覆盖的问题。
内容的提问来源于stack exchange,提问作者Chim Di Tru
相关产品推荐
相关产品推荐

