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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:15:04