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

Posted

技术标签:

【中文标题】使用 Flutter BLoC 模式跟踪多个状态【英文标题】:Keeping track of multiple states with Flutter BLoC pattern 【发布时间】:2021-02-28 01:38:21 【问题描述】:

我正在尝试使用 BLoC 模式制作身份验证屏幕,但即使在阅读了 flutter_bloc 库的文档并阅读了多个实现之后,我仍然对最佳实践存有疑问。

我遇到的主要问题是关于状态管理。我的身份验证屏幕应处理以下状态:

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

我真的很想把所有的逻辑都放在一个块中以创建一个干净的架构。 有人说他们每个屏幕使用一个 bloc,有时整个应用程序使用一个 bloc,但 flutter_bloc 库说你应该为任何小部件使用一个 bloc足够复杂

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

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

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

在母 AuthState 类中将所有状态类作为变量传递? 然后我可以使用“state.passwordFieldState”保存数据。但是我 从来没有见过这样的东西。我敢打赌这是一个错误的方法。 创建一个模型来存储状态并在更改事件进入 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");
    
  

【问题讨论】:

【参考方案1】:

我想我找到了答案。

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

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

【讨论】:

以上是关于使用 Flutter BLoC 模式跟踪多个状态的主要内容,如果未能解决你的问题,请参考以下文章

什么时候应该在 Flutter 中使用 BLoC 模式?

使用 Flutter bloc_test 测试特定状态

Flutter Bloc 不会改变 TextFormField 的初始值

在不可变状态不实用的情况下使用 Bloc 模式

Flutter Bloc 不断重建小部件而不改变状态

使用 flutter_bloc 库有啥缺点