BlocBuilder接收Socket数据调用emit后未重建UI问题排查
问题分析与解决方案
核心问题:Bloc实例不统一
你在BlocBuilder里直接创建了新的PatientCardBloc()实例,这会导致:
- 每次
BlocBuilder重建时都会生成全新的bloc对象 - Socket事件发送到的是另一个bloc实例(比如你在别处初始化的那个),当前
BlocBuilder监听的是自己创建的bloc,自然接收不到状态更新
修复步骤
1. 确保全局/父级提供同一个Bloc实例
不要在BlocBuilder内部创建bloc,而是提前在父组件通过BlocProvider注入:
// 父组件注入示例 BlocProvider( create: (context) => PatientCardBloc(), child: YourChildWidget( // 包含BlocBuilder的组件 patient: patient, ), )
2. 修正BlocBuilder的使用方式
去掉bloc参数,让BlocBuilder自动从上下文获取父级提供的bloc实例,同时简化冗余的判断逻辑:
BlocBuilder<PatientCardBloc, PatientCardState>( builder: (context, state) { final targetAmount = state.status == PatientCardStatus.initialized && state.patient.id == patient.id ? state.patient.currentAmount : patient.currentAmount; return DonatedProgress( name: patient.firstName, disease: patient.problem.disease, currentAmount: targetAmount, totalAmount: patient.amount, ); }, ),
3. 可选:补充状态类的相等性判断
如果修复后仍不触发重绘,检查PatientCardState是否重写了==和hashCode。Bloc默认通过相等性判断状态是否变化,未重写的话可能会误判状态未更新:
class PatientCardState extends Equatable { final Patient patient; final PatientCardStatus status; const PatientCardState({required this.patient, required this.status}); @override List<Object> get props => [patient.id, patient.currentAmount, status]; }
(注:props里的属性需根据实际业务调整,只保留能标识状态变化的核心字段)
内容的提问来源于stack exchange,提问作者steind.VY
相关产品推荐
相关产品推荐

