Вход в телефон Firebase проверяется с помощью Flutter - PullRequest
0 голосов
/ 09 апреля 2020

Мне удалось отправить OTP с помощью Firebase. Номер также отображается в разделе Аутентификация -> Пользователи в консоли Firebase. Что мне нужно сделать, так это то, что если номер был подтвержден, я хочу перейти на следующую страницу. Как мне это сделать?

Еще одна вещь: когда я набираю номер и нажимаю кнопку «Подтвердить», он просто отправляет мне OTP-сообщение. Приложение не запрашивает второе TextFormField - «Enter OTP». Почему это происходит?

main.dart

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

class MyApp extends StatelessWidget {
    // This widget is the root of your application.
    @override
    Widget build(BuildContext context) {
        return MaterialApp(
      debugShowCheckedModeBanner: false,
            home: Authenticate().handleAuth(),
        );
    }
}

authenticate.dart

class Authenticate {
  //to handle auth
  handleAuth() {
    return StreamBuilder(
      stream: FirebaseAuth.instance.onAuthStateChanged,
      builder: (BuildContext context, snapshot) {
        if (snapshot.hasData) {
          return DashBoard();
        } else {
          return SignIn();
        }
      },
    );
  }

  //for signin
  signIn(AuthCredential authCreds) {
    FirebaseAuth.instance.signInWithCredential(authCreds);
  }

  //for manual otp entry
  signInViaOTP(smsCode, verId) {
    AuthCredential authCredential = PhoneAuthProvider.getCredential(
        verificationId: verId, smsCode: smsCode);
    signIn(authCredential);
  }

  signInViaOTPT(smsCode, verId) {
    AuthCredential authCredential = PhoneAuthProvider.getCredential(
        verificationId: verId, smsCode: smsCode);
    signIn(authCredential);
  }

  //for signout
  signout() {
    FirebaseAuth.instance.signOut();
  }
}

sign_in.dart

class SignIn extends StatefulWidget {
  @override
  _SignInState createState() => _SignInState();
}

class _SignInState extends State<SignIn> {
  final formKey = new GlobalKey<FormState>();
  String phoneNo, verId, smsCode;
  bool codeSent = false;

  Future<void> verifyNum(num) async{
    final PhoneVerificationCompleted verified = (AuthCredential authRes){
      Authenticate().signIn(authRes);
    };
    final PhoneVerificationFailed failed = (AuthException authExcep){

    };
    final PhoneCodeSent smsSent = (String verId, [int forceResend]){
      this.verId = verId;
      setState(() {
        this.codeSent = true;
      });
    };
    final PhoneCodeAutoRetrievalTimeout autoTimeOut = (String verId){
      this.verId = verId;
    };

    await FirebaseAuth.instance.verifyPhoneNumber(
      phoneNumber: num,
      timeout: const Duration(seconds: 5),
      verificationCompleted: verified,
      verificationFailed: failed,
      codeSent: smsSent,
      codeAutoRetrievalTimeout: autoTimeOut
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Form(
        key: formKey,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Padding(
              padding: EdgeInsets.only(left: 25.0, right: 25.0),
              child: TextFormField(
                keyboardType: TextInputType.phone,
                decoration: InputDecoration(hintText: "Enter Phone Number"),
                onChanged: (val) {
                  setState(() {
                    this.phoneNo = val;
                  });
                },
              ),
            ),
            codeSent ? Padding(
              padding: EdgeInsets.only(left: 25.0, right: 25.0),
              child: TextFormField(
                keyboardType: TextInputType.phone,
                decoration: InputDecoration(hintText: "Enter OTP"),
                onChanged: (val) {
                  setState(() {
                    this.smsCode = val;
                  });
                },
              ),
            ) : Container(),
            Padding(
              padding: EdgeInsets.only(left: 25.0, right: 25.0),
              child: RaisedButton(
                child: Center(
                  child: codeSent ? Text("Login") : Text("Verify"),
                ),
                onPressed: (){
                  codeSent? Authenticate().signInViaOTP(smsCode, verId) : verifyNum(phoneNo);
                },
              ),
            )
          ],
        ),
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...