Home > other >  FlutterFire Auth verifyPhoneNumber method isn't being waited on
FlutterFire Auth verifyPhoneNumber method isn't being waited on

Time:01-29

I'm trying to create an auth service and I want to return the verificationId from the custom method. However, calling this method throws the null check exception because it doesn't wait for the Future to complete before returning.

Future<String> sendPhoneVerification({
    required String phoneNumber,
  }) async {
    String? result;
    await FirebaseAuth.instance.verifyPhoneNumber(
      phoneNumber: ' 1$phoneNumber',
      verificationCompleted: (
        PhoneAuthCredential credential,
      ) {
        result = credential.verificationId;
      },
      verificationFailed: (e) {
        if (e.code == 'invalid-phone-number') {
          throw InvalidPhoneNumberAuthException();
        } else if (e.code == 'too-many-requests') {
          throw TooManyRequestsAuthException();
        } else {
          throw GenericAuthException();
        }
      },
      codeSent: (verificationId, resendToken) {
        print('ver_id $verificationId');
        result = verificationId;
      },
      codeAutoRetrievalTimeout: (_) {},
    );
    print('This is the result $result');
    return result!;
  }

Here is the output in the terminal.

flutter: This is the result null
flutter: ver_id <ver_id>

CodePudding user response:

One way to fix this would be to wrap the method in a Future and return the Future.

Future<String> sendPhoneVerification({
    required String phoneNumber,
  }) {
    return Future.delayed(Duration.zero, () async {
    String? result;
    await FirebaseAuth.instance.verifyPhoneNumber(
      phoneNumber: ' 1$phoneNumber',
      verificationCompleted: (
        PhoneAuthCredential credential,
      ) {
        result = credential.verificationId;
      },
      verificationFailed: (e) {
        if (e.code == 'invalid-phone-number') {
          throw InvalidPhoneNumberAuthException();
        } else if (e.code == 'too-many-requests') {
          throw TooManyRequestsAuthException();
        } else {
          throw GenericAuthException();
        }
      },
      codeSent: (verificationId, resendToken) {
        print('ver_id $verificationId');
        result = verificationId;
      },
      codeAutoRetrievalTimeout: (_) {},
    );
    print('This is the result $result');
    return result!;
    });
  }

CodePudding user response:

Please add this property timeout: const Duration(seconds: 60), in the verifyPhoneNumber() method

  • Related