我有以下问题...
在事件处理程序正常完成后调用发出。这通常是由于事件处理程序中没有等待的未来。请确保使用事件处理程序等待所有异步操作,并在调用 emit() 之前在异步操作之后使用 emit.isDone 以确保事件处理程序尚未完成。
坏 on((event, emit) { future.whenComplete(() => emit(...)); });
好的 on((event, emit) async { await future.whenComplete(() => emit(...)); }); )
发生的情况是,在一个名为_onLogIn的函数中,如果用户更改了语言,它会从那里转到 bloc 内的另一个函数,这两个函数不相互依赖,我的意思是每个函数在不同的页面中调用应用程序,但_onLogIn仍然检查_onChangeLanguage函数。
UserBloc({this.usecases}) : super(UserInitial()) {
on<LogInEvent>(_onLogIn);
on<ChangeLanguageEvent>(_onChangeLanguage);
}
_onLogIn 函数:
void _onLogIn(
LogInEvent event,
Emitter<StateA> emit,
) async {
emit(UserLoading());
final userOrFailure = await services.logIn(
x: event.x,
y: event.y,
);
await userOrFailure.fold((user) async {
/// If the user is logging in for the first time and does not
/// have a preferred language.
if (user.preferredLanguage == null) {
emit(UserSuccess());
emit(UserAlreadyLogged(connectedUser));
} else {
/// An ChangeLanguageEvent object
ChangeLanguageEvent event = ChangeLanguageEvent(
user.preferredLanguage,
user.someId,
);
/// Call the other function in the same bloc
this._onChangeLanguage(
event,
emit,
isFromLogin: true,
);
}
}, (failure) {
emit(UserError(failure.message));
});
}
_onChangeLanguage 函数:
void _onChangeLanguage(
ChangeLanguageEvent event,
Emitter<StateA> emit, {
bool isFromLogin = false,
}) async {
final successOrFailure = await services.updateLanguage(
event.language,
event.someId,
);
await successOrFailure.fold( // ! HERE THE ERROR WHEN I LOG IN; but when i changed the language from the application i don't have an error
(language) async {
emit(ChangeAppLanguage(language));
final sessionOrFailure = await services.getSession();
sessionOrFailure.fold(
(session) {
/// I need this condition to know if the language comes from login
if (isFromLogin) {
emit(UserSuccess());
}
emit(UserAlreadyLogged(session));
},
(failure) => emit(UserError(failure.message)),
);
},
(failure) {
emit(UserError(failure.message));
},
);
}
知道为什么吗?谢谢