使用 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 模式跟踪多个状态的主要内容,如果未能解决你的问题,请参考以下文章