![](/img/trans.png)
[英]Convert Default Flutter_bloc 8.0 Counter from Cubit to Bloc
[英]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.