Issues handling Navigation when exception occurs [Bloc]

Viewed 17

I'm creating a flutter app using bloc/cubit pattern. I'm having issues preventing navigation when an exception occurs, here's my button onTap function:

function: () async {
                            if (state.termsAndConditionsAccepted &&
                                state.status.isValid &&
                                !state.status.isPure) {
                              await context
                                  .read<SignUpCubit>()
                                  .onClickSignUp()
                                  .then(((value) => {Navigator.pop(context)}));
                            }

and here's the logic of sign in

Future<void> onClickSignUp() async {
    try {
      // sign in logic...

      // Provoking an exception...
     throw Exception('An error ocrred. Please try again.');

    } on Exception catch (exception) {
      String exMessage = exception.toString();
      log(exMessage);
      // This emits a new state with the error and shows an error snackbar based on this new state
      emit(state.copyWith(
          status: FormzStatus.submissionFailure,
          exceptionErrorMessage: exMessage));
    }

As far as I know, the .then() callback function will only be executed if the Future function completes successfully(onClickSignUp()) but the Navigation occurs even if the exception is thrown.

I managed make it work by returning a boolean value to the then() callback and do the navigation depending in that value(if true navigate/if false do nothing), but that would require me to return true when function completes successfully and return false in all my catch blocks which does not seems a good practice.

Since I'm handling the states from my cubit class I cannot use .onError or .catchError() callbacks on the button's function.

Hopefully someone can suggest a better error handling in this case or what could be an appropriate error handling for bloc pattern

0 Answers
Related