firebase - FirebaseAuth.instance.verifyPhoneNumber 无法正常工作 - Flutter
问题描述
await FirebaseAuth.instance.verifyPhoneNumber
await FirebaseAuth.instance.verifyPhoneNumber
从某种意义上说,在成功执行之前运行的代码无法正常工作。await
并没有真正做好它的工作。
为了便于理解问题,我不会分享所有代码,只分享相关代码。我有一个名为的视图CustRegView
,我从用户那里获取电话号码并将其发送到名为 进行身份验证的ViewModelCustRegViewModel
,该视图应该根据其身份验证返回真或假。
下面是视图的样子
class CustRegView extends StatelessWidget{
final TextEditingController _controller = TextEditingController();
@override
Widget build(BuildContext context) {
final deviceSize = MediaQuery.of(context).size;
return BaseView<CustRegViewModel>(
builder: (context, model, child) => Scaffold(
...<some code>
TextFeild( controller: _controller, ...<some code> )
...<some code>
FlatButton (
onPressed: () async {
var registerSuccess = await model.register( _controller.text, context);
if (registerSuccess) {
Navigator.pushNamed(context, 'newScreen');
} else {
UIHelper().showErrorButtomSheet(context, model.errorMessage);
}
)
}
下面是现在Viewmodel 的样子
class CustRegViewModel extends BaseViewModel {
final AuthService _authService = locator<AuthService>();
final DialogService _dialogService = locator<DialogService>();
dynamic newUserResult; <---- It will hold the authentication result value. IT'S VALUE SHOULD CHANGE FROM INSIDE "codeSent" FUNCTION OR "verificationCompleted" FUNCTION BUT IT IS NOT CHANGING
Future<bool> register(String phoneNo, BuildContext context) async {
print("Register function of viewModel is reached");
setState(ViewState.Busy);
await verifyPhone;
if(newUserResult != null){
print("Returning true" )
return true;
} else {
print("Returning false")
return false;
}
}
Future<void> verifyPhone(phoneNo) async {
String smsCode;
Future<String> getOTPresult() async { ...<some code> }
print("VerifyFunction is reached");
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: updatedPhoneNo,
timeout: Duration(seconds: 50),
verificationCompleted: (AuthCredential authCred) async {...... <some code>
verificationFailed: (AuthException authException) {...... <some code>
codeSent: (String verID, [int forceCodeResend]) async {
print(" --------------> Code sent reached. Will update newUserResult on success ");
var OTPDialogResult = await getOTPresult();
AuthCredential authCred = PhoneAuthProvider.getCredential( verificationId: verID, smsCode: OTPDialogResult);
newUserResult = AuthService().signInWithPhoneNumber(authCred);
},
codeAutoRetrievalTimeout: (String verID) {...
).catchError((error) {...... <some code>
print( "Automatically returning null");
}
}
在这里,所需的输出在控制台上应该是这样的
Register function of viewModel is reached
VerifyFunction is reached
--------------> Code sent reached. Will update newUserResult on success
Returning true
在达到 CustRegViewModel 注册函数时,我得到这样的输出,发送的代码在返回 false 后到达
Register function of viewModel is reached
VerifyFunction is reached
Automatically returning null
Returning false
--------------> Code sent reached. Will update newUserResult on success
解决方案
我实际上已经通过简单地使用completer
. 现在函数不会自动返回 null。Completer
等待verifyPhoneNumber
方法的整个执行并返回true
或false
基于所需的结果。我是这样用的。
Future<bool> verifyPhone(phoneNo) async {
var completer = Completer<bool>();
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: updatedPhoneNo,
timeout: Duration(seconds: 50),
verificationCompleted: (AuthCredential authCred) async {
....<some code>
completer.complete(true);
}
verificationFailed: (AuthException authException) {...... <some code>
codeSent: (String verID, [int forceCodeResend]) async {...... <some code>
codeAutoRetrievalTimeout: (String verID) {...
).catchError((error) {...... <some code>
return completer.future;
}
推荐阅读
- docker-compose - jfrog-artifactory docker 镜像 - 由于 nofile 使用而停止
- ruby-on-rails - has_one 和belongs_to 与同一张表的关联
- sql - 如何在 Laravel 中进行条件查询
- oracle-sqldeveloper - 无法从 Sql Developer 打开 plsql 对象
- java - 每次自动输入不同字符的密码字段的功能
- pyspark - 如何使用 pyspark 将 DataFrame 的每一行保存为 HDFS 文件
- vue.js - 清理后尝试访问 Vuex 状态
- java - 在 java selenium 中,我试图将退格字符 ('\uE003') 或 (\u0008) 发送到文本框以清除现有文本
- c++ - 如何在 Linux 上使用自定义 `iconv` 构建`boost`?
- c++ - 为 C++ 开发配置 Opensuse Leap 15.2