Flutter使用Provider+Sqflite时购物车角标重启后不更新问题
购物车启动时计数不显示问题解决方案
问题根因
- 异步读取本地购物车数据的
fetchCartProducts方法执行完成后,未调用Provider的notifyListeners()方法通知监听组件刷新,UI层的Consumer收不到数据更新信号,角标一直显示初始值0 - 后续添加商品时功能正常,是因为
addToCart方法中已经正确调用了notifyListeners(),触发了UI刷新 - HomeScreen中重复调用了两次
fetchCartProducts,属于冗余逻辑,不影响功能但无意义
修改步骤
1. 补充fetch方法的状态更新通知
修改CartProvider中的fetchCartProducts方法,在购物车数据赋值完成后添加notifyListeners():
Future<void> fetchCartProducts() async { final dataList = await DBHelper.getData('cart_food'); final entries = dataList .map((item) => CartModel( item['id'], item['price'].toDouble(), item['productName'], item['quantity'], )) .map((cart) => MapEntry(cart.id, cart)); _cartItems = Map<String, CartModel>.fromEntries(entries); // 新增此行,通知所有监听的UI组件刷新状态 notifyListeners(); print('inside fetchcart'); }
2. 清理HomeScreen的冗余调用
删除didChangeDependencies中的重复调用逻辑,initState中调用一次即可,不需要额外调用setState:
@override void initState() { super.initState(); _foodItems = ApiService.getFoodItems(); Provider.of<CartProvider>(context, listen: false).fetchCartProducts(); } @override void didChangeDependencies() { // 移除原有的购物车数据获取逻辑,避免重复调用 super.didChangeDependencies(); }
3. (可选)验证itemCount逻辑正确性
确认CartProvider中itemCount的getter逻辑符合你的业务需求:
// 按商品总数量统计(比如2份同款商品算2) int get itemCount => _cartItems.values.fold(0, (prev, curr) => prev + curr.quantity); // 按商品种类统计(比如2份同款商品算1) // int get itemCount => _cartItems.length;
修改完成后重启应用,购物车角标就会在本地数据读取完成后自动刷新显示正确计数。
内容的提问来源于stack exchange,提问作者Mahi
相关产品推荐
相关产品推荐

