【问题标题】:Flutter Firebase Verify Phone Completer got messed upFlutter Firebase 验证电话完成程序搞砸了
【发布时间】:2021-09-06 23:16:35
【问题描述】:

我正在尝试使用 Firebase 验证手机。

第一次验证(第一次verifyPhoneNumberFirebase调用没问题(打开验证码,没验证按回,还是去codeSent,不知道为什么)。

但是第二次验证(第二次verifyPhoneNumberFirebase,发生在第一次验证几秒钟之后)超时,运行codeAutoRetrievalTimeout。但奇怪的是 completer 完成了,尽管它被重新启动,但前一次调用 (codeSent) 的结果。这是代码

Future<DataResponse> verifyPhoneNumberFirebase({String phoneNumb}) async {
    final completer = Completer<DataResponse>(); /// <--- init and re-init
    _auth
        .verifyPhoneNumber(
      phoneNumber: phoneNumb,
      verificationCompleted: (PhoneAuthCredential credential) {
        completer.complete(successSomething(verificationId));
      },
      verificationFailed: (FirebaseAuthException e) {
        completer.complete(errorHandling('error');
        }
      },
      codeSent: (String verificationId, int resendToken) {
        completer.complete(successSomething(verificationId)); 
         /// the first complete, 
         /// and somehow the second complete, 
         /// even though it did not go to this line in the second call
      },
      codeAutoRetrievalTimeout: (String verificationId) {
        completer.complete(errorHandling('error'); /// <----- already completed ???
      },
    );
    return completer.future;
  }

这里是日志

[ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Bad state: Future already completed
_AsyncCompleter.complete (dart:async/future_impl.dart:45:31)
...

现在我不知道如何获得codeAutoRetrievalTimeout 输出。

【问题讨论】:

    标签: android ios firebase flutter firebase-authentication


    【解决方案1】:

    之所以出现错误,是因为您在 verificationCompleted 回调中使用了 Completer,而它已在 codeSent 回调中使用。

    您可以从codeSent 块中删除completer.complete,因为此时它还没有完成操作。

    以下是您的 _auth.verifyPhoneNumber 代码的更新:

         _auth
                .verifyPhoneNumber(
              phoneNumber: phoneNumb,
              verificationCompleted: (PhoneAuthCredential credential) {
                completer.complete(successSomething(verificationId));
              },
              verificationFailed: (FirebaseAuthException e) {
                completer.complete(errorHandling('error');
                }
              },
              codeSent: (String verificationId, int resendToken) {
                successSomething(verificationId); // Remove completer.complete
              },
              codeAutoRetrievalTimeout: (String verificationId) {
                completer.complete(errorHandling('error'); 
              },
            );
    

    【讨论】:

    • 啊,是的,我刚刚意识到第一个电话也是电话codeAutoRetrievalTimeout。所以这就引出了第二个问题:为什么第二次调用没有调用任何回调?也许是因为扑火?
    • 我没有完全得到第二个问题。需要注意的一点是,在完成操作时应该使用完成器。
    • 啊是的,事情就是这样。在我调用了这个函数之后,我再次调用了它(在它可以进入codeAutoRetrievalTimeout之前)。之后什么也没发生。它超出了最初的问题,但这正是我在这里真正想问的。
    • 您能否创建一个新问题来详细描述这一点,尤其是您两次调用该函数并将链接放在这里以便我查看的部分?
    • 我想我会把它留给 Flutterfire 团队。我找到了避免它的方法(不确定它是否正常工作)。
    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2012-01-18
    • 2017-07-03
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多