Flutter中verifyPhoneNumber加await未等待回调完成就执行后续代码如何解决
解决方案
你遇到的问题本质是 Firebase Auth 的 verifyPhoneNumber 方法返回的 Future 仅代表「验证请求已发送至服务端」,而非整个验证流程完成,所以即便加了await也不会等待后续回调执行,需要手动通过Completer控制异步流程。
实现步骤
- 引入
dart:async库,使用Completer手动控制异步任务的完成时机 - 在所有需要等待的回调执行完毕后,主动触发
Completer的完成状态 - 追加等待
Completer的Future,阻塞后续数据库操作代码直到验证流程结束
修改后的完整代码
import 'dart:async'; // 需先导入该库 static Future signUp(BuildContext context, String name, String phoneNumber, String email, String gender) async { // 实例化Completer,用于手动控制异步流程 final Completer<void> verifyCompleter = Completer(); await auth.verifyPhoneNumber( phoneNumber: phoneNumber, verificationCompleted: (credential) async { await auth.signInWithCredential(credential); // 回调执行完毕,标记Completer完成 if(!verifyCompleter.isCompleted) verifyCompleter.complete(); }, verificationFailed: (error) { _verificationFailed(error); // 验证失败,把错误抛出方便上层捕获 if(!verifyCompleter.isCompleted) verifyCompleter.completeError(error); }, codeSent: (String verificationId, int resendToken) async{ await _codeSent(verificationId, resendToken, context); // 若_codeSent逻辑需要用户手动输入验证码校验,可将complete调用移到验证码校验通过的逻辑后 if(!verifyCompleter.isCompleted) verifyCompleter.complete(); }, codeAutoRetrievalTimeout: (String timeout) { // 超时回调执行完毕,标记Completer完成 if(!verifyCompleter.isCompleted) verifyCompleter.complete(); }); // 等待验证流程完全结束,才会执行后续代码 await verifyCompleter.future; if (auth.currentUser != null) { await DB.users.doc(auth.currentUser.uid).set({ name: name, phoneNumber: phoneNumber, email: email, }); } return; }
注意事项
- 代码中加了
isCompleted判断,避免重复触发Completer导致报错 - 如果
_codeSent逻辑是跳转到验证码输入页等待用户操作,需要把verifyCompleter.complete()的调用移到「用户输入验证码、校验通过」的逻辑之后,避免还没等用户完成操作就提前执行后续数据库代码 - 可以在外层调用
signUp方法时加try catch捕获verificationFailed抛出的错误,做对应的弹窗提示等业务处理
内容的提问来源于stack exchange,提问作者RUSHIKESH NARWADE
相关产品推荐
相关产品推荐

