首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flutter firebase手机登录需要热重启才能通过认证

Flutter firebase手机登录需要热重启才能通过认证
EN

Stack Overflow用户
提问于 2018-10-01 09:27:36
回答 1查看 446关注 0票数 1

我的应用程序有一个电子邮件和电话注册,对于电子邮件,一旦我登录正确的信息我直接转移到主页,但是当我登录我的手机身份验证,它会带我回到认证页面,只让我进入主页,如果我热重新启动,我甚至试图直接导航到主页一旦认证完成,但我似乎不认识到我登录,直到我热重新启动,知道我怎么处理这个吗?

验证码:

代码语言:javascript
复制
String phoneNo;
String smsCode;
  String verificationId;
  String uid;

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

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

final PhoneVerificationCompleted verifiedSuccess = (FirebaseUser user) {
  print('verified');
};

final PhoneVerificationFailed veriFailed = (AuthException exception) {
  print('${exception.message}');
};

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

  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: EdgeInsets.all(10.0),
        actions: <Widget>[
          new FlatButton(
            child: Text('Done'),
            onPressed: () {
              FirebaseAuth.instance.currentUser().then((user) {
                if (user != null) {
                  setState(() {
                    this.uid = user.uid;
                    _submitForm(widget.model.authenticate, 2);

                    Navigator.of(context).pushReplacementNamed('/');
                  });
                } else {
                  Navigator.of(context).pop();
                  signIn();
                }
              });
            },
          )
        ],
      );
    });
  }

  signIn() async {
    _submitForm(widget.model.authenticate, 2);
  }}
  void _submitForm(Function authenticate, int option) async {if(option == 2) {
  Map<String, dynamic> successInformation;
  successInformation = await authenticate(
      null, phoneNo, null, tokenValue, uid, verificationId, smsCode);
  if (successInformation['success']) {
    Navigator.pushReplacementNamed(context, '/');
  }} else{

 Map<String, dynamic> successInformation;
  successInformation = await authenticate(_formData['Email'], null,
      _formData['Password'], tokenValue, null, null, null, _authMode);
  if (successInformation['success']) {
    print('success');
    Navigator.pushReplacementNamed(context, '/');
  } }

Future<Map<String, dynamic>> authenticate(
  String email,
  String phone,
  String password,
  String token,
  String id,
  String verificationId,
  String smsCode,
  [AuthMode mode = AuthMode.Login]) async {
_isLoading = true;
notifyListeners();
String uid;
final Map<String, dynamic> authData = {
  'email': email,
  'password': password,
  'returnSecureToken': true,
};
if (email != null) {
  try {
    FirebaseUser user = await FirebaseAuth.instance
        .signInWithEmailAndPassword(email: email, password: password);
    uid = user.uid;
  } catch (error) {
    _isLoading = false;
    notifyListeners();
  }
}  else {
  FirebaseUser user = await FirebaseAuth.instance.signInWithPhoneNumber(
      verificationId: verificationId, smsCode: smsCode);
  print(user);
  uid = user.uid;
}
_authenticatedUser =
    User(id: uid, phone: phone, email: email, token: token);
setAuthTimeout(int.parse(1000.toString()));
_userSubject.add(true);
email == null
    ? addTokenPhone(token, _authenticatedUser.phone, uid)
    : addToken(token, _authenticatedUser.email, uid);
final DateTime now = DateTime.now();
final DateTime expiryTime =
    now.add(Duration(seconds: int.parse(10000.toString())));
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('token', uid);
prefs.setString('userEmail', email);
prefs.setString('phone', phone);
prefs.setString('userId', uid);
prefs.setString('expiryTime', expiryTime.toIso8601String());
_isLoading = false;

notifyListeners();
return {
  'success': true,
  'message': 'message',
};
}
void autoAuthenticate() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final String token = prefs.getString('token');
final String expiryTimeString = prefs.getString('expiryTime');
if (token != null) {
  final DateTime now = DateTime.now();
  final parsedExpiryTime = DateTime.parse(expiryTimeString);
  if (!verified) {
    if (parsedExpiryTime.isBefore(now)) {
      _authenticatedUser = null;
      notifyListeners();
      return;
    }
  }
  final String userEmail = prefs.getString('userEmail');
  final String phone = prefs.getString('phone');
  final String userId = prefs.getString('userId');
  final int tokenLifespan = parsedExpiryTime.difference(now).inSeconds;
  _authenticatedUser =
      User(id: userId, email: userEmail, phone: phone, token: token);
  print(_authenticatedUser);
  _userSubject.add(true);
  setAuthTimeout(tokenLifespan);
  notifyListeners();
}
}

代码语言:javascript
复制
 bool _isAuthenticated = false;

@override
void initState() {
_model.autoAuthenticate();
_model.userSubject.listen(
  (bool isAuthenticated) {
    setState(
      () {
        _isAuthenticated = isAuthenticated;
      },
    );
  },
);
super.initState();
}

路由是这样设置的:

代码语言:javascript
复制
'/': (BuildContext context) =>
          !_isAuthenticated ? AuthPage() : HomePage(),
EN

回答 1

Stack Overflow用户

发布于 2018-10-02 01:11:25

我只是确保在每个需要id的方法中调用它:

代码语言:javascript
复制
    FirebaseUser user = await FirebaseAuth.instance.currentUser();

并为用户获取id和所有内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52583563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档