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

Bloc搭配Freezed开发时触发事件后Bottom Sheet反复弹出如何解决?

问题根因

你在HomePage中使用的BlocConsumer的listener没有添加状态变化过滤,只要NoteState发生更新,就会执行判断逻辑。当你点击单选按钮时,Bloc会生成新的NoteState实例,此时isAddNewNoteButtonClickedState的值仍然为true,会再次触发弹出Bottom Sheet的逻辑,就会出现重复弹出的问题。

解决方法

给BlocConsumer添加listenWhen参数,只在isAddNewNoteButtonClickedState从false变为true的时候才触发弹出逻辑,修改后的HomePage中BlocConsumer代码如下:

return BlocConsumer<NoteBloc, NoteState>(
  // 新增listenWhen过滤监听触发条件
  listenWhen: (previousState, currentState) {
    // 只有isAddNewNoteButtonClickedState从false切换为true时才触发listener
    return previousState.isAddNewNoteButtonClickedState == false 
        && currentState.isAddNewNoteButtonClickedState == true;
  },
  listener: (context, state) {
    // 原有弹出Bottom Sheet的逻辑保持不变
    _scaffoldKey.currentState!
        .showBottomSheet((context) => const AddNewNoteBottomSheet())
        .closed
        .then(
      (value) {
        context.read<NoteBloc>().add(
              const NoteEvent.addNewNoteButtonEvent(
                isClickedEvent: false,
              ),
            );
      },
    );
  },
  // 原有builder逻辑保持不变
  builder: (context, state) {
    // ... 原有代码
  },
);

修改后只有点击悬浮按钮触发状态切换的时候才会弹出Bottom Sheet,点击单选框、输入文本触发的状态更新不会触发弹出逻辑,问题即可解决。

内容的提问来源于stack exchange,提问作者Mariam Albarghouti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:48:05