【问题标题】:Do not want to complete the Future unless the verifyPhoneNumber method is complete除非 verifyPhoneNumber 方法完成,否则不想完成 Future
【发布时间】:2021-10-10 04:51:01
【问题描述】:

我想验证用户的电话号码,然后只允许该用户注册。但是为此,当我调用verifyPhoneNumber 时,即使我申请await 它也不会等到验证完成。它执行下一行。所以我想要做的是除非verificationCompleted,verificationFailed,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;
  }

谢谢!!

【问题讨论】:

    标签: flutter dart asynchronous async-await firebase-authentication


    【解决方案1】:

    FirebaseAuth.verifyPhoneNumber开始验证。我希望它返回的Future 在发出验证请求时完成,而不是在收件人完成验证时完成。

    如果你真的想要一个可以是awaited 的Future,你可以使用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;
            });
      }
      

      【讨论】:

      • 非常感谢您的回答!!但这里的问题不是 verifyPhoneNumber 在验证请求出现时完成其未来。它不会等到验证完成(成功或失败)。根据@jamesdlin 在同一篇文章中的另一个回答,完成者在这种情况下提供了帮助!
      猜你喜欢
      • 2020-07-08
      • 2019-03-02
      • 2023-04-05
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2010-09-12
      相关资源
      最近更新 更多