Flutter 如何在颤振阵型中在一个立方体中添加多个状态?
我在Flatter中开发了一个应用程序,它对登录进行基于OTP的身份验证。早些时候,我管理类本身的状态,以便可以使用setState方法相应地呈现UI。然后我换成了flifter_bloc cubit模式来管理状态。但我不明白,我怎么能在一个立方体里跟踪多个状态 考虑以下州和州法典:Flutter 如何在颤振阵型中在一个立方体中添加多个状态?,flutter,dart,flutter-bloc,cubit,Flutter,Dart,Flutter Bloc,Cubit,我在Flatter中开发了一个应用程序,它对登录进行基于OTP的身份验证。早些时候,我管理类本身的状态,以便可以使用setState方法相应地呈现UI。然后我换成了flifter_bloc cubit模式来管理状态。但我不明白,我怎么能在一个立方体里跟踪多个状态 考虑以下州和州法典: **State**. @immutable abstract class LoginState {} class LoginInitial extends LoginState { final Map l
**State**.
@immutable
abstract class LoginState {}
class LoginInitial extends LoginState {
final Map loginState;
LoginInitial({this.loginState});
}
**Cubit**
class LoginCubit extends Cubit<LoginState> {
Map loginState = {
"isPhoneSubmitted": false,
"isOtpArrived": false,
};
LoginCubit()
: super(
LoginInitial(
loginState: {
"isPhoneSubmitted": false,
"isOtpArrived": false,
},
),
);
void sendOtp() {
emit(
LoginInitial(
loginState: {
"isPhoneSubmitted": true,
"isOtpArrived": false,
},
),
);
Future.delayed(Duration(seconds: 4), () {
emit(
LoginInitial(
loginState: {
"isPhoneSubmitted": true,
"isOtpArrived": true,
},
),
);
});
}
}
然而,我认为这不是实现该模式的正确方法
你说得对。复杂状态开关的第一步是不使用Cubit
,而是使用实际的Bloc
。立方体用于非常简单的数据,基本上没有状态流逻辑。比如一个int,或者一个暗主题/光主题开关。或者可能是语言,在那里它只能是一个,而且完全是一个
但是你有一个复杂的流程。“中间”状态。因此,请使用
Bloc
并阅读有关此的教程,在这种情况下,正如您所说的那样,这不是一种正确的方法。为了更好地理解集团状态管理,请仔细阅读本教程。您可以在生成器函数中收听状态。将if语句更改为(状态为MyState)
,之后,当状态更改时,生成器应该得到更新。如果这回答了你的问题?谢谢你的评论@SilkeNL。如果我使用state is MyState方法,实际上可以在不同的状态类中操纵一个状态。即使如此,我如何跟踪多个状态值。如果我在下一次将一个属性更改为另一个属性时对其进行操作,正如@nvoigt的回答所说,使用Bloc而不是Cubit可能会更好。然后您可以产生不同的状态。在加载和加载状态之间来回切换。然后,您的小部件将在每次状态更改时更新。是的,@SilkeNL。我已经通过并将实施集团本身。事实上,我正在使用Flatter_bloc库。在他们的文档中,只有一个cubit示例。我跟随了这么多的指南,非常困惑。即使对于bloc,也有许多人使用Flatter_bloc,许多人直接从头开始编写。事实上,我的应用程序在将来会变得非常复杂。谢谢@nvoigt的建议。我试图实现集团本身,而不是使用立方体。然而,上面的例子非常复杂,会导致我有很多锅炉铭牌代码。如果可能的话,你能为我提供一个简单使用flutter_bloc库的例子吗。
BlocBuilder<LoginCubit, LoginState>(builder: (context, state) {
final data = (state as LoginInitial).loginState;
if (!data["isPhoneSubmitted"]) {
return phoneNumberSubmitWidget();
} else {
return codeVerificationWidget();
}
}),