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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:45:41