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

Flutter电商应用切换商品/收藏页面报Product已释放错误如何解决?

错误根因

  • Product实例被提前销毁报错:你为单个Product类混入了ChangeNotifier,且在收藏页面绑定单个商品数据时,使用了随页面生命周期管理的Provider创建方式。收藏页面销毁时,绑定在该页面的Product实例会被自动调用dispose()方法,切回全量商品页再次访问这些已销毁的实例就会触发对应报错。
  • 切回全量页商品消失:你之前写在items getter中的_showFavourite全局标记逻辑有问题:该标记是全局存储在Products provider中的,切换到收藏页将其设为true后,切回全量页没有重置为false,即使你现在注释了该逻辑,大概率其他地方还保留了修改全局标记、过滤商品列表的相关代码,导致全量页只返回收藏商品。

修复方案

推荐方案:收拢状态管理到全局Products provider

  1. 去掉Product类的ChangeNotifier混入,将收藏切换逻辑统一写到Products类中,避免单商品实例被意外销毁:
// 添加到Products类的代码
void toggleFavourite(String productId) {
  final targetIndex = _items.indexWhere((prod) => prod.id == productId);
  if (targetIndex < 0) return;
  _items[targetIndex].isFavourite = !_items[targetIndex].isFavourite;
  notifyListeners();
}
  1. 废弃全局_showFavourite标记,页面级的列表展示逻辑放到对应页面的State中管理:全量商品页直接读取items getter获取全量数据,收藏页直接读取favourite getter获取收藏数据,不要通过全局标记过滤全量列表。

备用方案:保留单Product可监听能力

如果业务需要单个Product作为可监听对象,绑定数据时使用ChangeNotifierProvider.value传入全局管理的Product实例,避免框架自动销毁外部实例:

// 商品列表项的Provider绑定写法,不要用create构造,用value传入已有实例
ChangeNotifierProvider.value(
  value: currentProduct,
  child: ProductItemWidget(),
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:54:03