Flutter Bloc在TabView页面中重复监听同一状态的问题求助
Flutter Bloc在TabView页面中重复监听同一状态的问题求助
各位好,我最近在开发Flutter项目时碰到了个Bloc相关的坑,想请大家帮忙支支招!
场景是这样的:我有个PaymentHistoryScreen页面,它是TabView里的一个子页面,页面里用了MultiBlocProvider来提供PaymentHistoryBloc和InvoiceDetailsBloc。现在发现每次切换Tab回到这个页面时,Bloc的状态监听会重复触发——同一个状态变化会被处理好几次,比如BlocBuilder里的UI更新逻辑跑了不止一遍,导致一些不必要的重复请求或者UI异常。
先贴一下我当前的核心代码片段:
class PaymentHistoryScreen extends StatefulWidget { static const String routeName = '/payment-history'; PaymentHistoryScreen({super.key, required this.hospitalNumber}); final String hospitalNumber; @override State<PaymentHistoryScreen> createState() => _PaymentHistoryScreenState(); } class _PaymentHistoryScreenState extends State<PaymentHistoryScreen> { final GlobalKey<NavigatorState> navigatorKey = GlobalKey(); @override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ BlocProvider( create: (context) => PaymentHistoryBloc(getService()), // 这里原本初始化时会添加事件,现在暂时注释掉了 // ..add( // PaymentHistoryGet( // hospitalNumber: widget.hospitalNumber, // ), // ), ), BlocProvider( create: (context) => InvoiceDetailsBloc(getService()), ), ], child: // 这里是TabView对应的页面布局,包含列表和其他UI元素 ); } }
我试过把初始化时的事件添加注释掉,但问题还是没解决。我怀疑是TabView切换时页面没有被正确dispose,导致旧的Bloc实例还在监听状态,新的Bloc实例又被创建,所以才会重复响应状态变化?
想请教下大家:
- 是不是我的BlocProvider的放置位置有问题?应该把它提到TabView的父页面去,而不是在子页面里创建?
- 有没有办法在页面离开时正确清理Bloc的监听,避免重复订阅?
- 或者是不是应该用
BlocProvider.value来复用同一个Bloc实例,而不是每次都create新的?
麻烦有经验的朋友给点思路,万分感谢!
备注:内容来源于stack exchange,提问作者Miraj Hossain Shawon
相关产品推荐
相关产品推荐

