Reputation: 71
I am doing phone authentication using firebase in flutter and I have defined a late variable called verification id so that when the otp is sent it is initialized by it's value and i can use it later, but it is always null why is that?
This is my cubit:
import 'package:bloc/bloc.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:meta/meta.dart';
part 'phone_auth_state.dart';
class PhoneAuthCubit extends Cubit<PhoneAuthState> {
late String verificationId;
PhoneAuthCubit() : super(PhoneAuthInitial());
Future<void> submitPhoneNumber(String phoneNumber) async {
emit(PhoneAuthLoading());
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: '$phoneNumber',
timeout: const Duration(seconds: 14),
verificationCompleted: verificationCompleted,
verificationFailed: verificationFailed,
codeSent: codeSent,
codeAutoRetrievalTimeout: codeAutoRetrievalTimeout,
);
}
void verificationCompleted(PhoneAuthCredential credential) async {
print('verificationCompleted');
await signIn(credential);
}
void verificationFailed(FirebaseAuthException error) {
print('verificationFailed : ${error.toString()}');
emit(PhoneAuthFailure(errorMessage: error.toString()));
}
void codeSent(String verificationId, int? resendToken) {
print('codeSent');
this.verificationId = verificationId;
emit(PhoneNumberSubmitted());
print("khlst code sent");
}
void codeAutoRetrievalTimeout(String verificationId) {
print('codeAutoRetrievalTimeout');
}
Future<void> submitOTP(String otpCode) async {
PhoneAuthCredential credential = PhoneAuthProvider.credential(
verificationId: this.verificationId, smsCode: otpCode);
await signIn(credential);
}
Future<void> signIn(PhoneAuthCredential credential) async {
try {
await FirebaseAuth.instance.signInWithCredential(credential);
emit(PhoneOTPVerified());
} catch (error) {
emit(PhoneAuthFailure(errorMessage: error.toString()));
}
}
Future<void> signOut() async {
await FirebaseAuth.instance.signOut();
}
User getLoggedInUser() {
User firebaseUser = FirebaseAuth.instance.currentUser!;
return firebaseUser;
}
}
The error is thrown in function submitOTP
Upvotes: 0
Views: 49
Reputation: 321
Try assigning the verificationId on codeAutoRetrievalTimeout
:
codeAutoRetrievalTimeout: (verificationId)=> this.verificationId = verificationId
Upvotes: 0