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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:48:03