在 flutter_bloc 中从一个州读到另一个州

To read from one State to Another in flutter_bloc

我一直在开发一个应用程序,基本结构如下所示。 拥有一个 MultiblocProvider。有两条路线。

 Route generateRoute(RouteSettings routeSettings) {
    switch (routeSettings.name) {
      case BASE_ROUTE:
        return MaterialPageRoute(
          builder: (_) => BlocProvider(
            create: (context) => SignupCubit(),
            child: SignUp(),
          ),
        );
      case OTP_VERIFY:
        return MaterialPageRoute(
          builder: (_) => MultiBlocProvider(
            providers: [
              BlocProvider(
                create: (context) => VerifyCubit(),
              ),
              BlocProvider(
                create: (context) => SignupCubit(),
              ),
            ],
            child: Verify(),
          ),
        );
      default:
        return MaterialPageRoute(builder: (_) => Broken());
    }
  }

在 OTP_Verify 路线中,我授予访问两个 Cubit、VerifyCubit() 和 SignupCubit() 的权限。

现在,我正在做的是, 有两个Screen,一个是SignUp,另一个是Verify。在注册屏幕中,如果状态为 SignUpSuccess,我正在导航以验证 OTP 屏幕。

 class SignUp extends StatelessWidget {
  const SignUp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    double deviceHeight = MediaQuery.of(context).size.height;

    return Scaffold(
      body: BlocListener<SignupCubit, SignupState>(
        listener: (context, state) {
          if (state is SignUpError) {
            showToast("Please try again");
          } else if (state is SignupSuccess) {
            print(state.email);
            Navigator.pushNamed(context, OTP_VERIFY); <--- Here
          } else if (state is EmailValidationError) {
            showToast("Not valid email");
          }
        },
        child: SafeArea(
          bottom: false,
          child: CustomScrollView(
            slivers: [
.... rest of code....

在 VerifyOTP 屏幕中,我正在尝试读取当前 SignUpCubit 的状态

  ....other code....
 ElevatedButton(
              style: ElevatedButton.styleFrom(
                  minimumSize: const Size.fromHeight(45),
                  primary: Theme.of(context).primaryColor),
              onPressed: () {
                final signUpState = BlocProvider.of<SignupCubit>(context).state; <--- Here
                if (signUpState is SignupSuccess) {
                  print(signUpState.email);
                }
                BlocProvider.of<VerifyCubit>(context).setOtp(otp);
              },
              child: const Text('Verify'),
            ),
          .....other code.....

这是我的注册状态

    part of 'signup_cubit.dart';

@immutable
abstract class SignupState {}

class SignupIntial extends SignupState {}

class SignUpError extends SignupState {}

class SignupSuccess extends SignupState {
  final String email;

  SignupSuccess({required this.email});
}

class EmailValidationError extends SignupState {}

现在我假设我已经在第一页中发出了 SignupSuccess,如果我已经通过 MultiBlocProvider 提供了该状态,我可以在第二页中阅读它。 但它没有发生。 Insted 我得到 SignUpIntial.

有人可以帮忙吗,我可能做错了什么,或者我的方法是否有效?

那是因为您在路由到 Verify 屏幕时提供了 SignupCubit 的新实例。因此 BlocProvider.of<SignupCubit>(context).state 将 return 其上方肘的状态仍处于初始状态。

我不知道为什么您需要检查 VerifySignupCubit 的状态,因为您只在 SignupSuccess 时导航到它,但无论如何,一个快速的解决方法是您声明并初始化 SignupCubit 的实例,并在 SignUpVerify 屏幕周围的提供程序中使用它。