Flutter:关闭重开底部模态框后ChangeNotifier Provider被释放报错求助
解决 "A UserTeam was used after being disposed." 问题
1. 模态框内正确获取Provider实例
别直接把UserTeam实例当参数传给模态框,要在模态框内部通过上下文获取上层的Provider实例:
showModalBottomSheet( context: context, builder: (modalCtx) { return Consumer<UserTeam>( builder: (_, userTeam, __) { // 这里直接使用userTeam构建UI return Container( // 模态框内容 ); }, ); }, );
如果不需要监听状态变化,用Provider.of<UserTeam>(modalCtx, listen: false)获取即可。
2. 给UserTeam加disposed状态校验
在你的UserTeam类里加个标记,防止disposed后调用notifyListeners:
class UserTeam extends ChangeNotifier { bool _disposed = false; @override void dispose() { _disposed = true; super.dispose(); } // 所有调用notifyListeners的方法都要加判断 void updateTeamInfo() { // 业务逻辑处理 if (!_disposed) notifyListeners(); } }
3. 避免在模态框内重复创建Provider
如果在showModalBottomSheet的builder里又创建了ChangeNotifierProvider<UserTeam>,模态框关闭时这个内部Provider的实例会被销毁,下次打开就会报错。确保模态框只使用首页层级的Provider,不要在内部重复创建。
4. 确认首页Provider的层级
把ChangeNotifierProvider<UserTeam>放在不会轻易被销毁的层级,比如MaterialApp的子节点,确保首页存在时Provider实例不会被释放:
void main() { runApp( ChangeNotifierProvider( create: (_) => UserTeam(), child: const MyApp(), ), ); }
要是必须放在首页,别在build方法里创建(会导致每次重建都生成新实例),可以在State的initState里初始化,或者使用ChangeNotifierProvider.value绑定已有的实例。
内容的提问来源于stack exchange,提问作者fazilSizzlers
相关产品推荐
相关产品推荐

