You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:18:03