Kevin Yang
Kevin Yang

Reputation: 737

flutter) Firebase Phone Auth's "verificationCompleted" does not work on Android devices

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

Answers (2)

BIS Tech
BIS Tech

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

Xuuan Thuc
Xuuan Thuc

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

Related Questions