使用Flutter BLoC模式跟踪多个状态



我正试图用BLoC模式制作一个身份验证屏幕,但即使在阅读了flatter_BLoC-lib的文档并阅读了多个实现之后,我也对最佳实践持怀疑态度。

我的主要问题是国家管理。我的身份验证屏幕应该处理以下状态:

  • 密码是否可见
  • 显示注册或登录屏幕
  • TextEdit验证
  • 正在加载(等待Firebase响应(
  • 如果通过身份验证,请显示主页。否则显示身份验证页面

我真的很想做blocs中的所有逻辑,以创建一个干净的架构。有些人说他们在每个屏幕上使用一个区块,有时是整个应用程序的区块,但flatter_bloc库说你应该对任何足够复杂的小部件使用区块。

我的问题是,如何处理多个状态?

  • 如果我将变量存储在从母体AuthState类扩展的状态类中,我就无法在mapEventToState中访问它因为该块仅接收AuthState类的母亲
  • 我尝试通过在事件中传递当前状态来处理同一组中的所有状态(如下面的代码所示(,但随后我无法正确设置初始状态

最佳实践解决方案是什么?

  • 将所有状态类作为变量传递到母AuthState类中?然后我可以使用";state.passwordFieldState";。但是我从来没有见过这样的事。我打赌这是一种错误的做法
  • 创建一个模型来存储状态,并在更改事件进入集团时操作模型
  • 创建多个区块或肘?一个立方体用于身份验证,1个立方体用于密码可见性,一个块用于身份验证处理?我担心的是嵌套的集团建设者
  • 或者,我应该为简单的事情忘记bloc,转而使用提供者吗?我不想这么做,因为这可能会导致意大利面条代码

这是我的代码:

class AuthState extends Equatable{
@override
List<Object> get props => [];
}
class PasswordFieldState extends AuthState{
final bool isObscured;
PasswordFieldState({this.isObscured});
@override
List<Object> get props => [isObscured];
}

class AuthEvent extends Equatable{
@override
List<Object> get props => [];
}
class SetObscurePassword extends AuthEvent{
bool isObscured = false;
}
class passwordTextEditChanged extends AuthEvent{}
class emailTextEditChanged extends AuthEvent{}

class AuthBloc extends Bloc<AuthEvent,AuthState> {
AuthBloc(AuthState initialState) : super(initialState);
@override
Stream<AuthState> mapEventToState(AuthEvent event) async* {
if (event is SetObscurePassword) {
yield PasswordFieldState(isObscured: !event.isObscured);
} else if (event is passwordTextEditChanged) {
print("validation handling");
} else if (event is emailTextEditChanged) {
print("validation handling");
}
}

我想我找到了答案。

不可能使用flatter_bloc库为整个应用程序制作一个块。只有使用流控制器来创建一个没有库的区块,才有可能做到这一点。

但为每一项不同的任务创建一个集团并不是一件坏事。它使代码更易于测试和理解。

最新更新