【问题标题】:Keeping track of multiple states with Flutter BLoC pattern使用 Flutter BLoC 模式跟踪多个状态
【发布时间】: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");
    }
  }

【问题讨论】:

    标签: flutter architecture flutter-bloc


    【解决方案1】:

    我想我找到了答案。

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-04
      • 2021-03-19
      • 2020-05-06
      • 2020-07-12
      • 2020-07-09
      • 2021-03-04
      • 2020-04-12
      • 2020-10-10
      • 2022-10-06
      相关资源
      最近更新 更多