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

Flutter购物车应用Provider无法从数据库加载历史购物车数据问题排查

问题排查

  • 类型转换错误:SQLite的db.query方法返回的是List<Map<String, dynamic>>类型,你强行将其转为List<Map<String, CartModel>>再转Map<String, CartModel>完全不合法,运行时会抛出类型转换异常,导致_cartItems赋值失败。
  • 没有通知状态更新:fetchCartProducts方法中给_cartItems赋值完成后,没有调用notifyListeners(),Provider无法通知UI刷新新的购物车数据。
  • getData方法返回类型定义错误:原生db.query返回的是普通键值对映射,不是CartModel类型的映射,返回类型声明本身就是错的。

修复方案

1. 修复DBHelper的getData方法

static Future<List<Map<String, dynamic>>> getData(String table) async {
  final db = await DBHelper.database();
  return db.query(table);
}

2. 重写CartProvider的fetchCartProducts方法

Future<void> fetchCartProducts() async {
  // 拿到数据库返回的原始动态类型数据
  final List<Map<String, dynamic>> dataList = await DBHelper.getData('cart_food');
  print(dataList);
  // 遍历转换为CartModel,组装成需要的Map结构
  _cartItems = {
    for (var item in dataList)
      item['id'] as String: CartModel(
        item['id'] as String,
        item['price'] as double,
        item['productName'] as String,
        item['quantity'] as int,
      )
  };
  // 通知监听者刷新UI
  notifyListeners();
}

可选修复:修正addToCart方法的quantity硬写问题

你当前的addToCart方法传了quantity参数,但创建CartModel的时候写死了1,会导致添加多数量商品时本地存储数据正常,但内存中的数量错误,建议修改:

void addToCart(
    String productId, String productName, int quantity, double price) {
  _cartItems.putIfAbsent(
    productId,
    () {
      DBHelper.insert('cart_food', {
        'id': productId,
        'productName': productName,
        'quantity': quantity,
        'price': price,
      });
      return CartModel(
        productId,
        price,
        productName,
        quantity, // 替换硬编码的1,使用传入的数量参数
      );
    },
  );
  notifyListeners();
}

内容的提问来源于stack exchange,提问作者Mahi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:24:03