首页 > 解决方案 > 投但不接

问题描述

我正在尝试使用 flutter-fire 包执行 Firebase 电话身份验证(使用 SMS),但是在“验证”过程中检查错误情况时遇到了一些障碍。

注意:抛出发生在 ChangeNotifierProvider 中,而捕获发生在一个单独的小部件中,该小部件使用提供者获取状态数据。

当我尝试调试时,我看到错误被抛出,但 catch 块没有被调用。

这是引发错误的地方(PhoneVerificationFailed 函数):

`

Future<void> verifyPhoneNumber(String phoneNumber) async {
    print("Verify Phone Number called");
    final PhoneCodeAutoRetrievalTimeout autoRetrieve = (String verId) {
      this._verificationID = verId;
    };

    final PhoneCodeSent smsCodeSent = (String verId, [int forceCodeResend]) {
      this._verificationID = verId;
      print("SMS Sent");
      this.smsSent = true;
      notifyListeners();
      throw (HttpException("Test"));
    };

    final PhoneVerificationCompleted verificationSuccessful =
        (AuthCredential user) {
      print("verified");
    };

    final PhoneVerificationFailed verificationFailed =
        (AuthException exception) {
      print("failed, ${exception.message}");
      throw (exception);
    };

    this._phoneNumber = phoneNumber;
    notifyListeners();

    var result = await FirebaseAuth.instance.verifyPhoneNumber(
      phoneNumber: phoneNumber,
      codeAutoRetrievalTimeout: autoRetrieve,
      codeSent: smsCodeSent,
      timeout: const Duration(seconds: 0),
      verificationCompleted: verificationSuccessful,
      verificationFailed: verificationFailed,
    );

    return result;
  }`

这是我有捕获代码的地方:

`Future<void> _submitPhoneNumber() async {
    _formKey2.currentState.save();
    setState(() {
      _isLoading = true;
    });
    try {
      await Provider.of<Auth>(context, listen: false)
          .verifyPhoneNumber(_authData['phoneNo']);
      setState(() {
        _isLoading = false;
      });
    } catch (error) {
      print("Exception caught ${error.message}");
      errorSnackBar(error.message, "Close");
    }
  }

`

编辑:我正在使用https://dart.dev/codelabs/async-await#example-async-and-await-with-try-catch中的代码游乐场,我发现只有在Future 返回一些东西,即使返回类型是 Future。这可能是根本原因吗?

标签: firebaseflutterfirebase-authentication

解决方案


您需要捕获您抛出的异常。

 try {
      await Provider.of<Auth>(context, listen: false)
          .verifyPhoneNumber(_authData['phoneNo']);
      setState(() {
        _isLoading = false;
      });
  } on HttpException catch (e) {   // add on HttpException 
      print("Exception caught ${error.message}");
      errorSnackBar(error.message, "Close");
    }
  }

推荐阅读