Проверка подлинности номера телефона Flutter null verifyId? - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь выполнить вход по номеру телефона, отправив sms-код на свое телефонное устройство с помощью firebase auth. Но ключевое слово await здесь, похоже, не работает. Зачем? Я предполагаю, что когда я назначаю await функции, Flutter печатает нулевое значение переменной verificationId, а verificationId получает свое значение в функции _sendCodeToPhoneNumber. Следовательно, это может означать, что функция _sendCodeToPhoneNumber еще не завершена, но ее следующая строка кода (print(verificationId) в данном случае) уже выполняется. Но если я ошибаюсь, то в чем проблема? и что еще более важно, научите меня, как решить проблему? Потому что мне нужно получить значение verificationId и передать его следующему классу.

String verificationId;

Future<void> _sendCodeToPhoneNumber() async {
    ...

    final PhoneCodeSent codeSent = (String verificationId, [int forceResendingToken]) async {
      this.verificationId = verificationId; //this.verificationId here is not null because it has got a value
      print('Code sent to ${_phoneNumberController.text} with $verificationId');
    };

    ...
    await FirebaseAuth.instance.verifyPhoneNumber(
      codeAutoRetrievalTimeout: codeAutoRetrievalTimeout,
      phoneNumber: _phoneNumberController.text,
      codeSent: codeSent,
      timeout: const Duration(seconds: 120),
      verificationCompleted: verificationCompleted,
      verificationFailed: vericationFailed
    );
  }

...

FlatButton(onPressed: (){
 await _sendCodeToPhoneNumber();
 print(verificationId); // printed null despite having assigned `await` to the _sendCodeToPhoneNumber function
 ...
})

Ответы [ 2 ]

0 голосов
/ 03 августа 2020
final PhoneCodeSent codeSent = (String verificationId, [int forceResendingToken]) async {
  this.verificationId = verificationId; //this.verificationId here is not null because it has got a value
  print('Code sent to ${_phoneNumberController.text} with $verificationId');
};

думаю, вам не нужен asyn c здесь

0 голосов
/ 02 августа 2020

Измените функцию на следующую и верните verificationId:

  Future<String> _sendCodeToPhoneNumber() async {
    final PhoneCodeSent codeSent = (String verificationId, [int forceResendingToken]) async {
      this.verificationId = verificationId; //this.verificationId here is not null because it has got a value
      print('Code sent to ${_phoneNumberController.text} with $verificationId');
    };
    await FirebaseAuth.instance.verifyPhoneNumber(
      codeAutoRetrievalTimeout: codeAutoRetrievalTimeout,
      phoneNumber: _phoneNumberController.text,
      codeSent: codeSent,
      timeout: const Duration(seconds: 120),
      verificationCompleted: verificationCompleted,
      verificationFailed: vericationFailed
    );
    return this.verificationId;
  }

Также измените onPressed, при использовании await вам нужно использовать async:

FlatButton(onPressed: (()async{
 var result = await _sendCodeToPhoneNumber();
 print(result);
}))
...