2

次の問題があります...

イベント ハンドラーが正常に完了した後で、emit が呼び出されました。これは通常、イベント ハンドラーでの未完了の未来が原因です。イベント ハンドラーを使用したすべての非同期操作を待機し、非同期操作の後、emit() を呼び出す前に emit.isDone を使用して、イベント ハンドラーが完了していないことを確認してください。

BAD on((イベント、エミット) { future.whenComplete(() => エミット(...)); });

GOOD on((event, emit) async { await future.whenComplete(() => emit(...)); }); )

_onLogInという関数で、ユーザーが言語を変更した場合、そこからブロック内の別の関数に移動します。これらの 2 つの関数は互いに依存していません。つまり、各関数は異なるページで呼び出されます。ただし、 _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