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

Flutter Provider(ChangeNotifierProxyProvider)断点调试报hasListeners为true错误

问题原因
  • 该报错是调试模式下的断言误报,不影响生产环境运行,生产环境默认关闭所有断言不会触发该问题。
  • 断言value.hasListeners != true是Provider的调试保护逻辑,本意是防止同一个ChangeNotifier实例被多个Provider重复挂载监听,导致状态通知混乱。
  • 正常运行不触发的原因是你的update逻辑本身无错误,执行速度快,Provider内部会按“取消旧实例监听→接收update返回的实例→挂载新监听”的流程快速执行,不会在断言检查的时机出现hasListeners为true的情况。
  • 断点触发报错的原因是:VS Code调试器在断点暂停时,会自动枚举当前作用域变量的公开属性展示在调试面板,刚好卡在Provider还未取消旧ProfileMock实例监听的时机,读取到hasListeners为true,触发断言。
解决方案
  • 方案1:无需修改业务代码,仅将该断点移除或暂时禁用,即可正常调试,生产环境完全不受影响。
  • 方案2:如果需要彻底消除该调试告警,确定复用旧ProfileMock实例的逻辑是安全的,可在ChangeNotifierProxyProvider配置中添加checkHasListeners: false关闭该断言检查:
ChangeNotifierProxyProvider<AuthMock, ProfileMock>(
  create: (_) => ProfileMock(),
  lazy: false,
  checkHasListeners: false, // 添加这一行关闭监听检查断言
  update: (_, auth, profile) {
    return profile!;
  },
  child: // 原有子节点
)
  • 方案3:如果你的业务逻辑允许Auth变化时创建新的ProfileMock实例,可直接在update中返回新实例,从根源避免旧实例带监听的问题:
update: (_, auth, previous) {
  return ProfileMock(auth: auth); // 每次返回新实例
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:36:03