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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:55:18