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

Flutter中重启对话框后Dialog状态不更新问题排查求助

问题根源:错误使用BlocProvider的实例传递方式

你遇到的问题核心在于在showDialog的builder里误用了BlocProvider.create来传递已存在的Bloc实例,而没有使用专门用于共享现有Bloc的BlocProvider.value构造器。

为什么会显示旧数据?

BlocProvider.create的设计初衷是创建新的Bloc实例,而非复用已有的。虽然你在create回调里返回了父级的Bloc实例,但这种用法会干扰Bloc的状态订阅逻辑:每次打开对话框时,新创建的BlocProvider无法正确关联Bloc的最新状态,导致对话框内的BlocBuilder始终停留在第一次打开时的旧状态快照,即便父级Bloc的数据已经更新。

修复方案

将showDialog中的BlocProvider替换为BlocProvider.value,直接传递父级已有的EsignBloc实例,确保对话框内的BlocBuilder能实时监听状态变化:

void _onClickHere(BuildContext context) {
  final dialog = Dialog(
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(AppConstants.borderRadius),
    ),
    elevation: 0.0,
    backgroundColor: Colors.transparent,
    child: _GetSignUsingOtpView(),
  );
  showDialog(
    context: context,
    builder: (_) => BlocProvider<EsignBloc>.value(
      value: BlocProvider.of<EsignBloc>(context), // 用value传递现有Bloc实例
      child: WillPopScope(
        onWillPop: () => Future.value(false),
        child: dialog,
      ),
    ),
    barrierDismissible: false,
  );
}

额外优化建议

你还可以在_GetSignUsingOtpView的BlocBuilder中添加buildWhen参数,限制只有当关心的状态字段变化时才重建Widget,提升性能:

BlocBuilder<EsignBloc, EsignState>(
  buildWhen: (previous, current) {
    // 仅当otp或remainingTime变化时触发重建
    return previous.otp != current.otp || previous.remainingTime != current.remainingTime;
  },
  builder: (context, state) {
    // ... 你的原有布局代码
  },
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:57:37