升级flutter_bloc 7.3后AuthBloc的close()方法是否会正常调用?
问题结论
你的close()方法的逻辑和写法完全正确,是否被调用和flutter_bloc升级后的新代码结构(用on替代mapEventToState、close放在类底部)没有任何关联。
核心原因说明
close()触发的前提
bloc的close方法不会自动凭空调用,触发逻辑在新旧版本没有变化,只有两种场景会执行:
- 你使用
BlocProvider创建bloc时,当BlocProvider对应的Widget被完全从Widget树中移除,框架会自动调用bloc的close方法。如果你把AuthBloc放在了App全局根节点的BlocProvider中,整个App运行期间该节点不会销毁,自然永远不会触发close,你加的打印也就不会输出。 - 如果你是手动实例化bloc、没有通过
BlocProvider管理,必须手动调用close()方法才会执行。
StreamSubscription的回收逻辑
只要close()被正常调用,你写的_userSubscription.cancel()就会正常执行,不会产生内存泄漏。如果close()始终没有触发,该订阅会一直持有回调引用,确实存在内存泄漏风险。
优化方案
- 如果AuthBloc本身就是全局生命周期、跟随App进程存活的,不需要额外处理,App退出时系统会自动回收所有资源,不存在泄漏问题,不需要纠结看不到close的打印。
- 如果AuthBloc是页面级别的,检查
BlocProvider的放置位置:要放在对应页面的build方法内,不要放在更高层级的父节点,保证页面销毁时BlocProvider会同步触发bloc的close方法。 - 如果是手动实例化管理bloc,在对应组件的dispose生命周期(比如StatefulWidget的dispose方法)中手动调用bloc的
close()方法即可。
内容的提问来源于stack exchange,提问作者Ian B
相关产品推荐
相关产品推荐

