Flutter电商应用切换商品/收藏页面报Product已释放错误如何解决?
错误根因
- Product实例被提前销毁报错:你为单个
Product类混入了ChangeNotifier,且在收藏页面绑定单个商品数据时,使用了随页面生命周期管理的Provider创建方式。收藏页面销毁时,绑定在该页面的Product实例会被自动调用dispose()方法,切回全量商品页再次访问这些已销毁的实例就会触发对应报错。 - 切回全量页商品消失:你之前写在
itemsgetter中的_showFavourite全局标记逻辑有问题:该标记是全局存储在Productsprovider中的,切换到收藏页将其设为true后,切回全量页没有重置为false,即使你现在注释了该逻辑,大概率其他地方还保留了修改全局标记、过滤商品列表的相关代码,导致全量页只返回收藏商品。
修复方案
推荐方案:收拢状态管理到全局Products provider
- 去掉
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(); }
- 废弃全局
_showFavourite标记,页面级的列表展示逻辑放到对应页面的State中管理:全量商品页直接读取itemsgetter获取全量数据,收藏页直接读取favouritegetter获取收藏数据,不要通过全局标记过滤全量列表。
备用方案:保留单Product可监听能力
如果业务需要单个Product作为可监听对象,绑定数据时使用ChangeNotifierProvider.value传入全局管理的Product实例,避免框架自动销毁外部实例:
// 商品列表项的Provider绑定写法,不要用create构造,用value传入已有实例 ChangeNotifierProvider.value( value: currentProduct, child: ProductItemWidget(), )
内容的提问来源于stack exchange,提问作者Asaad issa
相关产品推荐
相关产品推荐

