firebase电话号码身份验证不起作用未处理的异常:PlatformException(错误,空引用,空)

时间:2020-01-09 17:58:55

标签: firebase flutter dart firebase-authentication

注意:我的登录页面类和otpscreen类都是statefulwidget,我只是避免在此处显示多余的代码。

我正在尝试验证电话号码。 otp消息即将出现,但在单击“提交”按钮后无法确认,这是我收到的错误

E/flutter (21679): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: PlatformException(error, null reference, null)
E/flutter (21679): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:569:7)
E/flutter (21679): #1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:321:33)
E/flutter (21679): <asynchronous suspension>
E/flutter (21679): #2      MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:349:48)
E/flutter (21679): #3      MethodChannelFirebaseAuth.signInWithCredential (package:firebase_auth_platform_interface/src/method_channel_firebase_auth.dart:161:23)
E/flutter (21679): #4      FirebaseAuth.signInWithCredential (package:firebase_auth/src/firebase_auth.dart:208:10)
E/flutter (21679): #5      LoginRepository.signIn (package:doorstep/domain/repository/login-repository.dart:36:17)
E/flutter (21679): #6      OtpScreenState.submit.<anonymous closure> (package:doorstep/module/login/otpscreen.dart:90:26)
E/flutter (21679): #7      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:706:14)
E/flutter (21679): #8      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:789:36)
E/flutter (21679): #9      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
E/flutter (21679): #10     TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:486:11)
E/flutter (21679): #11     BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:264:5)
E/flutter (21679): #12     BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:199:7)
E/flutter (21679): #13     PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:467:9)
E/flutter (21679): #14     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:76:12)
E/flutter (21679): #15     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:117:9)
E/flutter (21679): #16     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:379:8)
E/flutter (21679): #17     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:115:18)
E/flutter (21679): #18     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:7)
E/flutter (21679): #19     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:218:19)
E/flutter (21679): #20     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:198:22)
E/flutter (21679): #21     GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
E/flutter (21679): #22     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
E/flutter (21679): #23     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter (21679): #24     _rootRunUnary (dart:async/zone.dart:1138:13)
E/flutter (21679): #25     _CustomZone.runUnary (dart:async/zone.dart:1031:19)
E/flutter (21679): #26     _CustomZone.runUnaryGuarded (dart:async/zone.dart:933:7)
E/flutter (21679): #27     _invoke1 (dart:ui/hooks.dart:273:10)
E/flutter (21679): #28     _dispatchPointerDataPacket (dart:ui/hooks.dart:182:5)

这是登录存储库

class LoginRepository{

  String verificationId;
  var _auth = FirebaseAuth.instance;

  Future<void> sendOtp(String _number) async {
    final PhoneVerificationCompleted phoneVerificationCompleted =
        (AuthCredential credential) {};
    final PhoneVerificationFailed phoneVerificationFailed =
        (AuthException exception) {
      print("Login Faild due to $exception");
    };
    final PhoneCodeSent phoneCodeSent =
        (String verificationId, [int forceResendingToken]) {
      this.verificationId = verificationId;
    };
    final PhoneCodeAutoRetrievalTimeout phoneCodeAutoRetrievalTimeout =
        (String verificationId) {
      this.verificationId = verificationId;
      print("time out");
    };
    await _auth.verifyPhoneNumber(
        phoneNumber: _number,
        timeout: Duration(seconds: 120),
        verificationCompleted: phoneVerificationCompleted,
        verificationFailed: phoneVerificationFailed,
        codeSent: phoneCodeSent,
        codeAutoRetrievalTimeout: phoneCodeAutoRetrievalTimeout);
  }

  Future<void> signIn(String otpCode) async {
    final AuthCredential authCredential = PhoneAuthProvider.getCredential(
        verificationId: verificationId, smsCode: otpCode);
    await _auth.signInWithCredential(authCredential);
  }
}

这是登录页面类

class LoginPage{
LoginRepository _loginRepository = LoginRepository();
  Widget send() {
    return FlatButton(
      child: Text("Send OTP"),
      onPressed: () {
        _loginRepository.sendOtp(_numberController.text);
      },
    );
  }
}

这是otp类

    class OtpScreen{
  LoginRepository _loginRepository = LoginRepository();
  Widget submit() {
    return FlatButton(
      child: Text("Submit"),
      onPressed: () async {
        _loginRepository.signIn(_otpController.text);
      },
    );
  }
}

1 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为在到达manualPhoneAuth函数时,verificationId为null。莫名其妙地没有在codeSent回调函数中分配验证ID。我将verifyId更改为一个静态变量,瞧,它起作用了。

将字符串验证ID更改为静态字符串验证ID