簡體   English   中英

flutter_bloc 可以在 bloc/cubit 類中存儲變量嗎

[英]flutter_bloc is it ok to store a variable inside bloc/cubit class

我有一個名為AuthCubit的肘位,其中我有多個與身份驗證相關的功能,例如登錄、重置密碼、...

問題是我的所有功能都需要在第一個屏幕上從用戶獲取的變量phoneNumber ,在檢查服務器中是否存在phoneNumber或應用程序導航到不同的屏幕之后。

所以我的問題是可以將phoneNumber存儲在AuthCubit類中並從那里使用它(就像它是如何使用 Provider/ChangeNotifier 完成的)? 還是我應該讓AuthState基類需要一個phoneNumber變量?

下面是來自 AuthCubit 的代碼片段

class AuthCubit extends Cubit<AuthState> {
  final LoginWithCredentialsUsecase _loginWithCredentialsUsecase;
  final CheckPhoneNumberExistUsecase _checkPhoneNumberExistUsecase;
  final SendOTPTokenUsecase _sendOTPTokenUsecase;
  final VerifyOTPTokenUsecase _verifyOTPTokenUsecase;
  final SendResetPasswordOtpUsecase _sendResetPasswordOtpUsecase;
  AuthCubit(
      {required LoginWithCredentialsUsecase loginWithCredentialsUsecase,
      required CheckPhoneNumberExistUsecase checkPhoneNumberExistUsecase,
      required SendOTPTokenUsecase sendOTPTokenUsecase,
      required VerifyOTPTokenUsecase verifyOTPTokenUsecase,
      required SendResetPasswordOtpUsecase sendResetPasswordOtpUsecase,
      required VerifyResetPasswordOtpUsecase verifyResetPasswordOtpUsecase})
      : _loginWithCredentialsUsecase = loginWithCredentialsUsecase,
        _checkPhoneNumberExistUsecase = checkPhoneNumberExistUsecase,
        _sendOTPTokenUsecase = sendOTPTokenUsecase,
        _verifyOTPTokenUsecase = verifyOTPTokenUsecase,
        _sendResetPasswordOtpUsecase = sendResetPasswordOtpUsecase,
        super(AuthInitial());
 
  Future<void> loginWithCredentianls(
      {String password = '',
      required String phoneNumber,
      String otpCode = ''}) async {
    emit(AuthLoading());
    try {
      final driver = await _loginWithCredentialsUsecase(
          password: password, phoneNumber: phoneNumber, otpCode: otpCode);
      emit(AuthSuccess(driver: driver));
    } on LoginFieldsNotCorrectException catch (e) {
      emit(AuthException(message: e.message));
    } on LoginNoRemainingChangeDeviceException catch (e) {
      emit(AuthException(message: e.message));
    } on LoginNotADriverException catch (e) {
      emit(AuthException(message: e.message));
    } catch (e) {
      emit(AuthFailed(message: e.toString()));
    }
  }

  Future<void> sendOTPMessageToPhoneNumber(String phoneNumber) async {
    emit(AuthLoading());
    try {
      final wasSuccess = await _sendOTPTokenUsecase(phoneNumber);
      if (wasSuccess) {
        emit(PhoneAuthOTPSent(phoneNumber: phoneNumber));
      } else {
        emit(phoneAuthFailedState);
      }
    } catch (e) {
      emit(phoneAuthFailedState);
    }
  }

  Future<void> checkPhoneAuthentication(String phoneNumber) async {
    emit(AuthLoading());
    try {
      final phoneNumberAuth = await _checkPhoneNumberExistUsecase(phoneNumber);
      if (phoneNumberAuth.isAuthenticated) {
        emit(PhoneAuthenticated(phoneNumber: phoneNumber));
      } else {
        emit(PhoneNotAuthenticated(
            message: phoneNumberAuth.message, phoneNumber: phoneNumber));
      }
    } catch (error) {
      emit(phoneAuthFailedState);
    }
  }

  Future<void> verifyOTPToken(String token, String phoneNumber) async {
    emit(AuthLoading());
    try {
      final wasSuccess = await _verifyOTPTokenUsecase(token, phoneNumber);
      if (wasSuccess) {
        emit(PhoneAuthOTPVerified(phoneNumber: phoneNumber, otpCode: token));
      } else {
        emit(PhoneAuthOTPNotVerified(
            message: 'کد وارد شده صحیح نیست', otpCode: token,phoneNumber: phoneNumber));
      }
    } catch (error) {
      emit(phoneAuthFailedState);
    }
  }

  Future<void> sendResetPasswordOtp(String phoneNumber) async {
    emit(AuthLoading());
    try {
      await _sendResetPasswordOtpUsecase(phoneNumber);
      emit(PhoneAuthOTPSent(phoneNumber: phoneNumber));
    } on ResetPasswordException catch (e) {
      emit(ResetPasswordExceptionState(message: e.message));
    } catch (e) {
      emit(phoneAuthFailedState);
    }
  }
}

這是基於意見的......但我會說是的,或者至少可以將電話號碼存儲在 AuthCubit 中。 這取決於如何創建關於 phoneNumber 的 AuthCubit。

如果 AuthCubit 可以在沒有 phoneNumber 的情況下存在,然后 phoneNumber 稍后設置,那么您應該讓 AuthState 攜帶反映該 phoneNumber 設置或未設置的狀態。

但是,如果從未創建 AuthCubit,並且在沒有 phoneNumber 存在的情況下永遠無法創建,那么您可以將 phoneNumber 作為最終參數添加到 AuthCubit 類。

暫無
暫無

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

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