gpt4 book ai didi

flutter - 异步函数未在Flutter中返回预期数据

转载 作者:行者123 更新时间:2023-12-03 02:52:32 26 4
gpt4 key购买 nike

我正在尝试使用Firebase验证电话号码。但是从异步函数中得到了意想不到的结果。这是我的代码:

  bool isVerificationSuccess = false;

Future<bool> verifyUserPhoneNumber(String phoneNumber) async {
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: phoneNumber,
timeout: Duration(seconds: 60),
verificationCompleted: (credential) => verificationComplete(credential),
verificationFailed: (authException) => verificationFailed(authException),
codeAutoRetrievalTimeout: (verificationId) =>
codeAutoRetrievalTimeout(verificationId),
codeSent: (verificationId, [code]) => smsCodeSent(verificationId, [code]),
);
print("Status from service : $isVerificationSuccess");
return isVerificationSuccess;
}

verificationComplete(AuthCredential credential) async {
FirebaseUser user = await FirebaseAuth.instance.currentUser();

user.linkWithCredential(credential).then((_) {
print("User Successfully Linked");
isVerificationSuccess = true;
}).catchError((e) {
print("Linking Error : ${e.toString()}");
});
}

这是输出:
 Status from service : false
User Successfully Linked

因此,这里 verifyUserPhoneNumber函数甚至在 FirebaseAuth.instance.verifyPhoneNumber()完成之前就返回,因此即使验证成功,它也不会返回预期数据(总是 false)。怎么了

最佳答案

问题是此行中的函数调用:

verificationCompleted: (credential) => verificationComplete(credential),

即使函数本身是异步的,也不会等待。所以发生的是:
  • verifyUserPhoneNumber
  • 某个地方调用
  • FirebaseAuth.instance.verifyPhoneNumber正在等待
  • 在此调用中,调用了verificationComplete(credential),由于它本身包含一个await语句,它将被Dart事件循环排队。所以FirebaseUser user = await FirebaseAuth.instance.currentUser();延迟之后会发生什么!
  • verifyUserPhoneNumber现在继续执行并返回false
  • 在返回值之后,现在就转到verificationComplete进行处理。它将更改 bool(boolean) 值,然后退出。

  • 我在这里的建议不是使用全局变量,而是例如,在 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;
    }
    }

    关于flutter - 异步函数未在Flutter中返回预期数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60868127/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com