Проблема заключается в том, что вызов функции в этой строке:
verificationCompleted: (credential) => verificationComplete(credential),
не ожидается, хотя сама функция является асинхронной. Итак, что происходит:
verifyUserPhoneNumber
вызывается откуда-то FirebaseAuth.instance.verifyPhoneNumber
ожидается - В этом вызове
verificationComplete(credential)
вызывается и, потому что он сам содержит оператор await, он будет поставлен в очередь событием Dart l oop. Поэтому, что бы ни случилось после задержки FirebaseUser user = await FirebaseAuth.instance.currentUser();
! verifyUserPhoneNumber
теперь продолжает выполняться и возвращает false
. - После того, как значение уже возвращено, оно теперь равно
verificationComplete
. обратиться к процессу. Это изменит логическое значение и затем завершится.
Моя рекомендация здесь не в том, чтобы использовать глобальную переменную, а вместо этого, например, вызвать verificationComplete
после FirebaseAuth.instance.verifyPhoneNumber
уже полностью закончил обработку и вернул.
Редактировать: Это, как вы могли бы теоретически решить проблему, хотя это не особенно красиво, я признаю:
Future<bool> verifyUserPhoneNumber(String phoneNumber) async {
final completer = Completer<AuthCredential>();
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: phoneNumber,
timeout: Duration(seconds: 60),
verificationCompleted: completer.complete,
verificationFailed: completer.completeError,
codeAutoRetrievalTimeout: (verificationId) =>
codeAutoRetrievalTimeout(verificationId),
codeSent: (verificationId, [code]) => smsCodeSent(verificationId, [code]),
);
try {
final credential = await completer.future;
return await verificationComplete(credential);
} catch (e) {
verificationFailed(e);
return false;
}
}
Future<bool> verificationComplete(AuthCredential credential) async {
FirebaseUser user = await FirebaseAuth.instance.currentUser();
try {
await user.linkWithCredential(credential);
print("User Successfully Linked");
return true;
} catch (e) {
print("Linking Error : ${e.toString()}");
return false;
}
}