Reputation: 737
I authenticate through firebase phone auth, and on Android, I want to authenticate automatically through "verificationComplete". However, the function "codeSent" is called instead of "verificationCompleted".
Future<void> _sendingCode(String phoneNum, BuildContext context) async {
FirebaseAuth auth = FirebaseAuth.instance;
return await auth.verifyPhoneNumber(
phoneNumber: phoneNum,
forceResendingToken: _forceResendingToken,
verificationCompleted: (PhoneAuthCredential credential) async {
logger.d('verificationCompleted - $credential');
// Sign the user in (or link) with the auto-generated credential
await auth.signInWithCredential(credential).then((value) async {
// next page
context.read<PageController>().animateToPage(2,
duration: Duration(milliseconds: 500), curve: Curves.ease);
}).catchError((e) => logger.w(e));
},
codeAutoRetrievalTimeout: (String verificationId) {
logger.w('timeout');
},
codeSent: (String verificationId, int? forceResendingToken) {
logger.d("$phoneNum send code");
_verificationId = verificationId;
_forceResendingToken = forceResendingToken;
},
verificationFailed: (FirebaseAuthException error) {
logger.e("Error: $error");
},
);
}
Can I know the cause of this problem?
Upvotes: 1
Views: 1031
Reputation: 19504
You have to implement both functions. onVerificationCompleted
function not working all the time.
More details about onVerificationCompleted
link
Add the same logic inside your codeSent
method.
Upvotes: 1
Reputation: 2521
onVerificationCompleted()
will only be called when the phone number has been verified without any input from the user. To do what you are trying, you should be sending your action inside onCodeSent()
instead.
Obtain phone number from user
Call PhoneAuthProvider.verifyPhoneNumber(auth)
(as you are already) to send the pin to the user
onCodeSent()
is called, with the verification ID and a resending token.
Inside of onCodeSent()
, create an method to launch the "pin input screen" with the verification ID.
Get a pin from the user and then combine it with the verification ID by calling PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, userInput)
Use that credential to sign in the user using signInWithCredential(credential).
Upvotes: 1