2

我有以下问题...

在事件处理程序正常完成后调用发出。这通常是由于事件处理程序中没有等待的未来。请确保使用事件处理程序等待所有异步操作,并在调用 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));
      },
    );
  }

知道为什么吗?谢谢

4

1 回答 1

1
void _onChangeLanguage(
    ChangeLanguageEvent event,
    Emitter<StateA> emit, {
    bool isFromLogin = false,
  }) async

这应该是一个主要的危险信号。标记为 的调用async,但不返回Future<>。没有办法,调用者可能会等待这个调用。或者甚至知道他们应该等待这个电话。

让它返回一个正确的Future<void>而不是公正的void,你的集团应该接受它并正确地等待电话。

甚至有一个 linter 规则:avoid_void_async。你关掉你的linter了吗?不要那样做。打开你的 linter 并聆听它。您的其他功能也有同样的问题。

于 2022-01-25T16:20:36.927 回答