# #flutter #dart #asynchronous #async-await #firebase-authentication
Вопрос:
Я хочу проверить номер телефона пользователя, а затем разрешить только этому пользователю зарегистрироваться. Но для этого, когда я звоню verifyPhoneNumber
, даже если я подаю await
заявление, оно не ждет завершения проверки. он выполняет следующую строку. Итак, что я хочу сделать, так это если ни одна из проверок не завершена, проверка не завершена, codeAutoRetrievalTimeout не завершится, я хочу подождать, а затем только выполню код, который создает документ для пользователя в базе данных. Любая помощь будет оценена по достоинству!!!
static Future signUp(BuildContext context, String name, String phoneNumber,
String email, String gender) async {
await auth.verifyPhoneNumber(
phoneNumber: phoneNumber,
verificationCompleted: (credential) async {
await auth.signInWithCredential(credential);
},
verificationFailed: _verificationFailed,
codeSent: (String verificationId, int resendToken) async{
await _codeSent(verificationId, resendToken, context);
},
codeAutoRetrievalTimeout: (String timeout) {});
if (auth.currentUser != null) {
await DB.users.doc(auth.currentUser.uid).set({
name: name,
phoneNumber: phoneNumber,
email: email,
});
}
return;
}
Спасибо!!
Ответ №1:
FirebaseAuth.verifyPhoneNumber
начинается проверка. Я ожидаю, что его возврат Future
завершится, когда будет выдан запрос на проверку, а не когда получатель завершит проверку.
Если вы действительно хотите, чтобы a Future
можно было await
редактировать, вы можете использовать a Completer
. Один из способов использовать его для преобразования вашего набора обратных вызовов завершения:
var verificationCompleter = Completer<PhoneAuthCredential>();
await auth.verifyPhoneNumber(
phoneNumber: phoneNumber,
verificationCompleted: (credential) {
verificationCompleter.complete(credential);
},
verificationFailed: (error) {
verificationComplete.completeError(error);
},
codeSent: (String verificationId, int resendToken) async{
await _codeSent(verificationId, resendToken, context);
},
codeAutoRetrievalTimeout: (String id) {
verificationComplete.completeError(
TimeoutException('Verification request timed out'),
);
},
);
PhoneAuthCredential credential;
try {
credential = await verificationComplete.future;
} on FirebaseAuthException catch (e) {
_verificationFailed(error);
return;
} on TimeoutException {
// Handle a timeout error however you like.
// ...
return;
}
await auth.signInWithCredential(credential);
if (auth.currentUser != null) {
// ...
}
Ответ №2:
Вы можете .then
сделать оговорку. поэтому в свой код вы можете вложить его, как показано ниже. value
параметр содержит любую информацию, переданную из кода, ожидаемого для then
предложения.
static Future signUp(BuildContext context, String name, String phoneNumber,
String email, String gender) async {
await auth.verifyPhoneNumber(
phoneNumber: phoneNumber,
verificationCompleted: (credential) async {
await auth.signInWithCredential(credential);
},
verificationFailed: _verificationFailed,
codeSent: (String verificationId, int resendToken) async{
await _codeSent(verificationId, resendToken, context);
},
codeAutoRetrievalTimeout: (String timeout) {}).then((value){
//Code you want to execute after the above is completed.
if (auth.currentUser != null) {
await DB.users.doc(auth.currentUser.uid).set({
name: name,
phoneNumber: phoneNumber,
email: email,
});
}
return;
});
}
Комментарии:
1. Большое вам спасибо за ваш ответ!! но проблема здесь не в том, что verifyPhoneNumber завершает свое будущее, когда запрос на проверку был отправлен. Он не ждет завершения проверки(успешной или неудачной). Согласно другому ответу @jamesdlin в том же посте, который помог в этом случае!!