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
相关产品推荐
相关产品推荐

