簡體   English   中英

使用 Flutter BLoC 模式跟蹤多個狀態

[英]Keeping track of multiple states with Flutter BLoC pattern

我正在嘗試使用 BLoC 模式制作身份驗證屏幕,但即使在閱讀了 flutter_bloc lib 的文檔並閱讀了多個實現之后,我仍然對最佳實踐持懷疑態度。

我的主要問題是關於狀態管理。 我的身份驗證屏幕應處理以下狀態:

  • 密碼可見與否。
  • 顯示注冊或登錄屏幕。
  • 文本編輯驗證。
  • 正在加載(等待 Firebase 響應)。
  • 如果通過身份驗證,請顯示回家。 否則顯示身份驗證頁面

我真的很想在 bloc 中完成所有的邏輯來創建一個干凈的架構。 有些人說他們每個屏幕使用一個 bloc,有時一個用於整個應用程序的 bloc,但 flutter_bloc 庫說你應該為任何足夠復雜的小部件使用 bloc。

我的問題是,我如何處理多個狀態?

  • 如果我將變量存儲在從母 AuthState 類擴展的狀態類中,我將無法在 mapEventToState 中訪問它,因為該塊只接收母 AuthState 類。
  • 我嘗試通過在事件中傳遞當前狀態來處理同一組中的所有狀態(如下面的代碼所示),但是我無法正確設置初始狀態。

最佳實踐解決方案是什么?

  • 將所有狀態類作為變量傳遞給母 AuthState 類? 然后我可以使用“state.passwordFieldState”來保存數據。 但我從未見過那樣的東西。 我敢打賭這是一個錯誤的方法。
  • 創建一個模型來存儲狀態並在更改事件進入集團時操作模型?
  • 創建多個集團或肘? 一肘用於身份驗證,一肘用於密碼可見性,一肘用於身份驗證處理? 我對此的擔憂是嵌套集團建設者。
  • 或者我應該為了簡單的事情忘記集團並改用提供者? 我不想這樣做,因為它會導致意大利面代碼

這是我的代碼:

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_bloc庫為整個應用程序創建一個 只有使用流控制器來創建一個沒有庫的 bloc 才能做到這一點。

但是為每個不同的任務創建一個塊並不是一件壞事。 它使代碼更易於測試且更易於理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM