在 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 其上方肘的状态仍处于初始状态。
我不知道为什么您需要检查 Verify
中 SignupCubit
的状态,因为您只在 SignupSuccess
时导航到它,但无论如何,一个快速的解决方法是您声明并初始化 SignupCubit
的实例,并在 SignUp
和 Verify
屏幕周围的提供程序中使用它。
我一直在开发一个应用程序,基本结构如下所示。 拥有一个 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 其上方肘的状态仍处于初始状态。
我不知道为什么您需要检查 Verify
中 SignupCubit
的状态,因为您只在 SignupSuccess
时导航到它,但无论如何,一个快速的解决方法是您声明并初始化 SignupCubit
的实例,并在 SignUp
和 Verify
屏幕周围的提供程序中使用它。