0

我一直在开发一个应用程序,这里的基本结构看起来像。有一个 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()。

现在,我正在做的是,有两个屏幕,一个是注册,另一个是验证。在注册屏幕中,如果状态为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 提供了该状态,我可以在第二页中阅读它。但它没有发生。我得到了SignUpIntial

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

4

1 回答 1

1

那是因为您提供了一个新的SignupCubitwhile 路由到VerifyScreen 实例。因此BlocProvider.of<SignupCubit>(context).state将返回其上方仍处于初始状态的肘位状态。

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

于 2022-02-15T01:28:23.423 回答