flutter - 如何在flutter中使用Firebase使用电话身份验证来检查用户是否已登录?

标签 flutter dart firebase-authentication

在这里,我通过使用Firebase的OTP代码通过电话号码进行了身份验证,但
登录成功后,它会浏览主页,但是当我单击返回时
它拖了我登录屏幕。

在这里,我尝试过的代码,但是没有用

 @override
  void initState() {
    super.initState();
   isSignedIn();
  }


  void isSignedIn() async {
    this.setState(() {
      isLoading = true;
    });

  firebaseAuth.currentUser().then((user){
    if(user !=null){
      Navigator.of(context).pushReplacementNamed('/homepage');
    }else{
       verifyPhone();
    }
  });
  this.setState(() {
    isLoading = false;
  });

  }


获取otp码的方法
Future<void> verifyPhone()async{
    final PhoneCodeAutoRetrievalTimeout autoRetrieval=(String verId){
      this.verificationId=verId;
    };

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



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

    final PhoneVerificationFailed verfifailed=(AuthException exception){
      print("${exception.message}");
    };

    await firebaseAuth.verifyPhoneNumber(
     phoneNumber: this.phoneNo,
     codeAutoRetrievalTimeout: autoRetrieval,
     codeSent: smsCodeSent,
     timeout: const Duration(seconds: 10),
     verificationCompleted: verificationCompleted,
     verificationFailed: verfifailed
    );
  }

这是使用OTP代码登录的对话框
Future<bool> smsCodeDialog(BuildContext context){
    return showDialog(
      context: context,
      barrierDismissible: false,
      builder: (BuildContext context){
        return new AlertDialog(
          title: Text('Enter sms Code'),
          content: TextField(
            onChanged: (value){
              this.smsCode=value;
            },
          ),
          contentPadding: const EdgeInsets.all(10.0),
          actions: <Widget>[
            new FlatButton(
              child: Text("Done"),
              onPressed: (){
                firebaseAuth.currentUser().then((user){
                  if(user !=null){
                    Navigator.of(context).pop();
                    Navigator.of(context).pushReplacementNamed('/homepage');
                  }else{
                    Navigator.of(context).pop();
                    signIn();
                  }
                });
              },
            )
          ],
        );
      }
    );
  }

电话号码登录的方法
signIn()async{
    AuthCredential credential= PhoneAuthProvider.getCredential(
      verificationId: verificationId,
      smsCode: smsCode
    );
    await  firebaseAuth.signInWithCredential(credential).then((user){
       Navigator.of(context).pushReplacementNamed('/homepage');
         print('signed in with phone number successful: user -> $user');
    }).catchError((onError){
      print(onError);
    });
  }
`

最佳答案

在Stackoverflow和Flutter开发中欢迎 Shruti Ramnandan Sharma

您的代码似乎对我来说很好用,我为您编写了一页 Dart ,可以测试整个代码,并通过返回Login或VerifyPhone页面修复问题。

Note: I changed your order of code in verifyPhone() method.

And Changed Navigator.of(context).pushReplacementNamed('/homepage'); to

Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => HomeRoute()));



整个代码在这里
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';

void main() => runApp(VerifyPhoneRoute());

class VerifyPhoneRoute extends StatefulWidget {
  @override
  _VerifyPhoneRouteState createState() {
    return _VerifyPhoneRouteState();
  }
}

class _VerifyPhoneRouteState extends State<VerifyPhoneRoute> {
  bool isLoading = false;
  FirebaseAuth firebaseAuth = FirebaseAuth.instance;
  String verificationId;
  String phoneNo = "Your number here";
  String smsCode;

  @override
  void initState() {
    super.initState();
    isSignedIn();
  }

  void isSignedIn() async {
    this.setState(() {
      isLoading = true;
    });

    firebaseAuth.currentUser().then((user) {
      if (user != null) {
        Navigator.pushReplacement(
          context,
          MaterialPageRoute(builder: (context) => HomeRoute()),
        );
      } else {
        verifyPhone();
      }
    });
    this.setState(() {
      isLoading = false;
    });
  }

  Future<void> verifyPhone() async {
    final PhoneVerificationCompleted verificationCompleted =
        (AuthCredential credential) {
      print("verified");
    };

    final PhoneVerificationFailed verifyFailed = (AuthException exception) {
      print("${exception.message}");
    };

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

    final PhoneCodeAutoRetrievalTimeout autoRetrieval = (String verId) {
      this.verificationId = verId;
    };

    await firebaseAuth.verifyPhoneNumber(
        phoneNumber: this.phoneNo,
        codeAutoRetrievalTimeout: autoRetrieval,
        codeSent: smsCodeSent,
        timeout: const Duration(seconds: 10),
        verificationCompleted: verificationCompleted,
        verificationFailed: verifyFailed);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Inapp Plugin by dooboolab'),
        ),
        body: Center(
          child: RaisedButton(
              child: Text("Verify"),
              onPressed: () {
                verifyPhone();
              }),
        ),
      ),
    );
  }

  Future<bool> smsCodeDialog(BuildContext context) {
    return showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          return new AlertDialog(
            title: Text('Enter sms Code'),
            content: TextField(
              onChanged: (value) {
                this.smsCode = value;
              },
            ),
            contentPadding: const EdgeInsets.all(10.0),
            actions: <Widget>[
              new FlatButton(
                child: Text("Done"),
                onPressed: () {
                  firebaseAuth.currentUser().then((user) {
                    if (user != null) {
                      Navigator.of(context).pop();
                      Navigator.pushReplacement(
                        context,
                        MaterialPageRoute(builder: (context) => HomeRoute()),
                      );
                    } else {
                      Navigator.of(context).pop();
                      signIn();
                    }
                  });
                },
              )
            ],
          );
        });
  }

  signIn() async {
    AuthCredential credential = PhoneAuthProvider.getCredential(
        verificationId: verificationId, smsCode: smsCode);
    await firebaseAuth.signInWithCredential(credential).then((user) {
      Navigator.pushReplacement(
        context,
        MaterialPageRoute(builder: (context) => HomeRoute()),
      );
      print('signed in with phone number successful: user -> $user');
    }).catchError((onError) {
      print(onError);
    });
  }
}

class HomeRoute extends StatefulWidget {
  @override
  _HomeRouteState createState() {
    return _HomeRouteState();
  }
}

class _HomeRouteState extends State<HomeRoute> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Inapp Plugin by dooboolab'),
        ),
        body: Center(
          child: Text("Welcome There."),
        ),
      ),
    );
  }
}

这段代码对我来说很好用。因此,如果您再次遇到任何问题,请随时对此答案发表评论。如果这回答了您的问题并解决了您的问题,请作为答案。

关于flutter - 如何在flutter中使用Firebase使用电话身份验证来检查用户是否已登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57393402/

相关文章:

具有共享首选项的 Flutter 依赖注入(inject)

flutter - 如何在行中放置容器

android - Flutter 重平台代码导致 UI 滞后

Flutter 将函数传递给 TextEditingController(text)

dart - Dart编辑器 “source not available”

Flutter - 如何创建圆形背景颜色?

ios - 注销并重新登录时出现窗口层次结构错误

android - 如何在 Flutter 中将文件从本地存储导入到数据库中

firebase - android studio FirebaseAuth(IllegalArgumentException:给定的String为空或null)

android - Firebase 和 Google-Auth 以及 Phone-Auth 的 SHA-1 问题