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

Flutter bloc开发中如何解决Failed Assertion:!_isComplete异常

错误原因
  • Bloc要求事件处理回调必须等待所有内部异步操作执行完成后再结束,你代码中number.fold的Right分支是异步函数,但fold本身不会主动等待内部异步任务执行,导致整个事件回调在接口请求完成前就提前终止。
  • 后续接口请求完成调用emit时,事件处理器已经销毁,就触发了emit was called after an event handler completed normally异常。
修复代码

核心修改点是给number.fold添加await关键字,确保异步任务被正常等待:

on<ConcreteNumberTriviaGottenEvent>((event, emit) async {
  emit(NumberTriviaLoadingState());
  final number =
      InputConverter.convertStringToUnsignedInteger(event.numberString);
  print(number);
  
  // 新增await等待fold内部异步逻辑执行完成
  await number.fold(
    (numberFailure) => emit(Error(message: failMessage(numberFailure))), 
    (numberInt) async {
      final either = await concreteTriviaUseCase.exec(numberInt);
      either.fold(
        (serverFailure) =>  emit(Error(message: failMessage(serverFailure))),
        (numberTrivia) => emit(NumberTriviaLoadedState(numberTrivia: numberTrivia))
      );
    }
  );
});
可选优化

如果使用的是Bloc 7.2+版本,可以在emit前增加状态校验,进一步避免极端场景下的异常:

调用emit前先判断emit.isDone状态,确认事件处理器未被销毁再执行状态更新:

either.fold(
  (serverFailure) {
    if(!emit.isDone) emit(Error(message: failMessage(serverFailure)));
  },
  (numberTrivia) {
    if(!emit.isDone) emit(NumberTriviaLoadedState(numberTrivia: numberTrivia));
  }
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:39:03