在最新的 Bloc 迁移后,成功的 Bloc 不工作

Succeeding Bloc are not working after latest Bloc migration

在将其迁移到 v8.0.1 之前,我正在使用适用于所有 Bloc 的 MultiBlocProvider。现在,只有第一个 Bloc (SignInBloc) 在工作。 这是我的 main.dart

            return MultiBlocProvider(
              providers: [
                BlocProvider<SignInBloc>(
                  create: (context) => SignInBloc(
                    authenticationRepository: authenticationRepository,
                    userDataRepository: userDataRepository,
                  ),
                ),
                BlocProvider<SignUpBloc>(
                  create: (context) => SignUpBloc(
                    authenticationRepository: authenticationRepository,
                    userDataRepository: userDataRepository,
                  ),
                ),

编辑:这是我的 SignInBloc

  SignInBloc(
      {required this.authenticationRepository,
      required this.userDataRepository})
      : super(SignInInitialState()) {
    on<CheckIfSignedInEvent>(mapCheckIfSignedInEventToState);
  }

  Future<void> mapCheckIfSignedInEventToState(
    CheckIfSignedInEvent event,
    Emitter<SignInState> emit,
  ) async {
    try {
      bool isSignedIn = await authenticationRepository.checkIfSignedIn();
      if (isSignedIn) {
        emit(CheckIfSignedInEventCompletedState(true));
      } else {
        emit(CheckIfSignedInEventCompletedState(false));
      }
    } catch (e) {
      print(e);
      emit(CheckIfSignedInEventFailedState());
    }
  }

我不确定要显示什么,但这是我的 SignUpBloc,它类似于我的 SignInBloc

  SignUpBloc(
      {required this.authenticationRepository,
      required this.userDataRepository})
      : super(SignUpInitialState()) {
    on<SignUpWithGoogle>(mapSignUpWithGoogleEventToState);
  }

  Stream<SignUpState> mapSignUpWithGoogleEventToState(
    SignUpWithGoogle event,
    Emitter<SignUpState> emit,
  ) async* {
    emit(SignUpInProgressState());

    try {
      User? checkUser = await authenticationRepository.checkIfUserExists();

      if (checkUser != null) {
        emit(SignUpWithGoogleInitialExistState());
      } else {
        bool checkDup =
            await authenticationRepository.checkIfUserDup(event.name);

        if (checkDup == true) {
          emit(SignUpWithNameExistState());
        } else {
          User firebaseUser = await authenticationRepository.signUpWithGoogle();
          emit(SignUpWithGoogleInitialCompletedState(firebaseUser));
        }
      }
    } catch (e) {
      print(e);
      emit(SignUpWithGoogleInitialFailedState());
    }
  }

我的 main.dart 将调用具有 bloc 声明的启动画面

late SignInBloc signInBloc;
late SignUpBloc signupBloc;

class _SplashScreenState extends State<SplashScreen> {

  @override
  void initState() {
    super.initState();

    signInBloc = BlocProvider.of<SignInBloc>(context);
    signupBloc = BlocProvider.of<SignUpBloc>(context);

我试图做的是放置大量 Print 语句以检查调用了哪个部分,但我不明白为什么不再调用 SignUpBloc。请帮忙。谢谢!

编辑:我尝试调试。 这将触发我的 SignInBloc。我可以收听我的 SignInBloc。

signInBloc.add(CheckIfSignedInEvent());

这应该触发我的 SignUpBloc。但它与我的 SignInBloc 没有任何相似之处。

signupBloc.add(SignUpWithGoogle(name: selectedName));

这是我的两个事件以供比较:

class CheckIfSignedInEvent extends SignInEvent {
  @override
  String toString() => 'CheckIfSignedInEvent';
}
class SignUpWithGoogle extends SignUpEvent {
  final String name;

  SignUpWithGoogle({required this.name});

  @override
  String toString() => 'SignUpWithGoogleEvent';
}

这是我收听初始屏幕中的状态的部分。只有 signInBloc 可以收听。

    signupBloc.stream.listen((state) {
      print('BLOC: signupBloc splash screen init : $state');
    });

    signInBloc.stream.listen((state) {
      print('BLOC: signinBloc splash screen init : $state');
    });

事实证明,将 Stream 更改为 Future 可以解决我的问题。 async* 也应该改为 async

Future<void> mapSignUpWithGoogleEventToState(
    SignUpWithGoogle event,
    Emitter<SignUpState> emit,
  ) async {
    emit(SignUpInProgressState());

    try {
      User? checkUser = await authenticationRepository.checkIfUserExists();

      if (checkUser != null) {
        emit(SignUpWithGoogleInitialExistState());
      } else {
        bool checkDup =
            await authenticationRepository.checkIfUserDup(event.name);

        if (checkDup == true) {
          emit(SignUpWithNameExistState());
        } else {
          User firebaseUser = await authenticationRepository.signUpWithGoogle();
          emit(SignUpWithGoogleInitialCompletedState(firebaseUser));
        }
      }
    } catch (e) {
      print(e);
      emit(SignUpWithGoogleInitialFailedState());
    }
  }