firebase - flutter : how to fix Lost connection to device error with firebase PhoneNumberAuth

标签 firebase authentication flutter

我正在实现 phoneNumberAuth 注册。但是有个问题

当我单击 authbottom 时,终止的 iOS 应用程序

代码 :

String smsCode, verificationId;

  Future<void> verifyPhone() async {
    final PhoneCodeAutoRetrievalTimeout autoRetrieve = (String verId) {
      this.verificationId = verId;
    };

    final PhoneCodeSent smsCodeSent = (String verId, [int forceCodeResend]) {
      this.verificationId = verId;
      print('asd');
      smsCodeDialog(context).then((value) {
        print('Signed in');
      });
    };

    final PhoneVerificationCompleted verificationCompleted = (AuthCredential credential) {
      print('verified');
    };

    final PhoneVerificationFailed verfiFailed = (AuthException exception) {
      print('${exception.message}+ddddddddddd');
    };

    await FirebaseAuth.instance.verifyPhoneNumber(
      phoneNumber: this.phoneNo,
      timeout: const Duration(seconds: 5),
      verificationCompleted: verificationCompleted,
      verificationFailed: verfiFailed,
      codeSent: smsCodeSent,
      codeAutoRetrievalTimeout: autoRetrieve,
    );
  }

  Future<bool> smsCodeDialog(BuildContext context) {
    return showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text('SMS 코드를 입력해주세요'),
            content: TextField(
              onChanged: (value) {
                this.smsCode = value;
              },
            ),
            contentPadding: EdgeInsets.all(10),
            actions: <Widget>[
              FlatButton(
                child: Text('Done'),
                onPressed: () {
                  FirebaseAuth.instance.currentUser().then((user) {
                    if (user != null) {
                      Navigator.of(context).pop();
                      Navigator.of(context).pushReplacementNamed('/');
                    } else {
                      Navigator.of(context).pop();
                      SIGNIn();
                    }
                  });
                },
              )
            ],
          );
        });
  }



  SIGNIn() async{
    final AuthCredential credential = PhoneAuthProvider.getCredential(
      verificationId: verificationId,
      smsCode: smsCode,
    );
    print('진행중');
    FirebaseAuth _auth = FirebaseAuth.instance;
    final FirebaseUser user = (await _auth.signInWithCredential(credential)).user;
    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);
    setState(() {
      if(user != null){
        print('success!');
      }else{
        print('sign in failed');
      }
    });
  }

错误代码 :

*** First throw call stack:
(
    0   CoreFoundation                      0x00000001169bb8db __exceptionPreprocess + 331
    1   libobjc.A.dylib                     0x0000000115f66ac5 objc_exception_throw + 48
    2   CoreFoundation                      0x00000001169d9c94 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
    3   CoreFoundation                      0x00000001169c0623 ___forwarding___ + 1443
    4   CoreFoundation                      0x00000001169c2418 _CF_forwarding_prep_0 + 120
    5   Runner                              0x000000010e97d966 -[FIRPhoneAuthProvider internalVerifyPhoneNumber:UIDelegate:completion:] + 118
    6   Runner                              0x000000010e97ccc0 __64-[FIRPhoneAuthProvider verifyPhoneNumber:UIDelegate:completion:]_block_invoke + 272
    7   libdispatch.dylib                   0x0000000115e16ccf _dispatch_call_block_an<…>
Lost connection to device.


我该如何修复我的代码?

在有人帮助我之前,我正在尝试修复

这很难,因为解释错误并不多。

如果有人帮助我,我将不胜感激。

来人帮帮我 :(

最佳答案

pop删除顶级小部件。不确定在此之后放置逻辑是个好主意。最好重新安排您的代码,例如

  // Only gets SMS, no functionality
  Future<String> getSmsCode(BuildContext context) {
    return showDialog<String>(
      context: context,
      barrierDismissible: false,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('SMS 코드를 입력해주세요'),
          content: TextField(
            onChanged: (value) {
              this.smsCode = value;
            },
          ),
          contentPadding: EdgeInsets.all(10),
          actions: <Widget>[
            FlatButton(
              child: Text('Done'),
              onPressed: () {
                Navigator.of(context).pop(this.smsCode);
              },
            )
          ],
        );
      },
    );
  }


  SIGNIn() async {
    String smsCode = await getSmsCode(context);
    if (smsCode != null && !smsCode.isNotEmpty) {
      print('User cancelled SMS dialog');
      return;
    }
    final AuthCredential credential = PhoneAuthProvider.getCredential(
      verificationId: verificationId,
      smsCode: smsCode,
    );
    print('진행중');
    FirebaseAuth _auth = FirebaseAuth.instance;
    final FirebaseUser user = (await _auth.signInWithCredential(credential)).user;
    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);
    setState(() {
      if (user != null) {
        print('success!');
      } else {
        print('sign in failed');
      }
    });
  }


现在只调用 SIGNIn ,它将首先获取短信代码,然后使用该短信代码登录。希望能帮助到你。

关于firebase - flutter : how to fix Lost connection to device error with firebase PhoneNumberAuth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58144140/

相关文章:

flutter - 您将如何从这个小部件树创建一个独立的小部件?

javascript - 如何从firestore获取数据到谷歌云功能?

java - 如何使用 Android 在 Cloud Firestore 中的特定文档之后查询集合?

android - 尝试使用 .push() 访问存储在 Firebase 中的对象

firebase - 在 Flutter App 中检查 Firebase Auth 中是否存在电子邮件

facebook - 使用 Tomcat 领域或 Facebook 登录进行身份验证

php 身份验证 token + ios

PHP检查用户是否使用函数登录

exception - Flutter:应用程序崩溃并出现运行时异常 - 回复已提交

flutter - 如何在 flutter 中每隔 x 秒从 api 获取数据?