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
相关产品推荐
相关产品推荐

