Google Flutter登录保持登录状态 [英] Flutter google sign in stay logged in

查看:151
本文介绍了Google Flutter登录保持登录状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经实现了firebase auth google登录,但是在关闭应用程序后如何保持登录状态,我什至将此行放在await _auth.currentUser()上,但仍然无法正常工作.下面是我的登录代码.

I have implemented the firebase auth google sign in but how do i able to stay logged in after the app is closed, i even put this line await _auth.currentUser() but still not working. Below is my login code.

LoginPage.dart (旧)

import 'package:flutter/material.dart';

import 'package:firebase_auth/firebase_auth.dart';

//Google provider
import 'package:google_sign_in/google_sign_in.dart';
import 'package:flutter_facebook_login/flutter_facebook_login.dart';
import 'package:flutter_auth_buttons/flutter_auth_buttons.dart';

final FirebaseAuth _auth = FirebaseAuth.instance;
final GoogleSignIn _googleSignIn = new GoogleSignIn();

class LoginPage extends StatefulWidget {
    @override
    _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
String _email;
String _password;
GoogleSignInAccount _currentUser;

@override
void initState() {
  super.initState();
  _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) 
{
  setState(() {
    _currentUser = account;
  });
  if (_currentUser != null) {
    //_handleGetContact();
  }
});
_googleSignIn.signInSilently();
}

//google sign in
GoogleSignIn googleAuth = new GoogleSignIn();

//Facebook sign in
FacebookLogin fbLogin = new FacebookLogin();

Future<FirebaseUser> _testSignInWithGoogle() async {
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth =
    await googleUser.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(
  accessToken: googleAuth.accessToken,
  idToken: googleAuth.idToken,
);
final FirebaseUser user = await _auth.signInWithCredential(credential);
assert(user.email != null);
assert(user.displayName != null);
assert(!user.isAnonymous);
assert(await user.getIdToken() != null);

final FirebaseUser currentUser = await _auth.currentUser();
assert(user.uid == currentUser.uid);

print('Signed in as ${user.displayName}');
Navigator.of(context).pushReplacementNamed('/homepage');

return await _auth.currentUser();
}

void _facebookLogin() async {
var facebookLogin = FacebookLogin();
var facebookLoginResult =
    await facebookLogin.logInWithReadPermissions(['email', 
'public_profile']);

 switch (facebookLoginResult.status) {
  case FacebookLoginStatus.error:
    print("Error");
    onLoginStatusChanged(false);
    break;
  case FacebookLoginStatus.cancelledByUser:
    print("CancelledByUser");
    onLoginStatusChanged(false);
    break;
  case FacebookLoginStatus.loggedIn:
    print("LoggedIn");
    onLoginStatusChanged(true);

    FacebookAccessToken myToken = facebookLoginResult.accessToken;
    AuthCredential credential= 
FacebookAuthProvider.getCredential(accessToken: myToken.token);
    try {
      final FirebaseUser user = await 
FirebaseAuth.instance.signInWithCredential(credential);

      //Navigator.pushReplacement(context, MaterialPageRoute(builder: 
(context) => DiscoverPage()));
      print('Signed in as ${user.displayName}');
      Navigator.of(context).pushReplacementNamed('/homepage');
    } catch (e) {
      debugPrint("Facebook signin error: " + e.toString());
    }
    break;
}
}

bool isLoggedIn = false;

void onLoginStatusChanged(bool isLoggedIn) {
setState(() {
  this.isLoggedIn = isLoggedIn;
});
}


}
}

LoginPage.dart (新)

class _LoginPageState extends State<LoginPage> {
bool loading = false;

bool isLoggedIn = false;

void onLoginStatusChanged(bool isLoggedIn) {
setState(() {
  this.isLoggedIn = isLoggedIn;
});
}

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

void isSignedIn() async {
setState(() {
  loading = true;
});

isLoggedIn = await _googleSignIn.isSignedIn();

if (isLoggedIn) {
  Navigator.pushReplacement(
      context, MaterialPageRoute(builder: (context) => HomePage()));
}

setState(() {
  loading = false;
});
}
}

我必须添加此代码才能保持登录状态.顺便问一下,我如何为Facebook制作相同的代码?

I have to add this code in order to stay signed in. By the way, how do i able to make the same for Facebook?

推荐答案

Future googleSignIn() async {
try {
  GoogleSignInAccount googleUser = await _googleSignIn.signIn();
  GoogleSignInAuthentication googleAuth = await googleUser.authentication;

  final AuthCredential credential = GoogleAuthProvider.getCredential(
    accessToken: googleAuth.accessToken,
    idToken: googleAuth.idToken,
  );

  FirebaseUser _user = (await _auth.signInWithCredential(credential)).user;
  assert(_user.email != null);
  assert(_user.displayName != null);
  assert(!_user.isAnonymous);
  assert(await _user.getIdToken() != null);


    DatabaseServices(uid:_user.uid,email: _user.email)
        .updateUserData(_user.displayName,_user.photoUrl);

  print("signed in " + _user.displayName + "\n" + _user.photoUrl);

  return _user;
} catch (e) {
  print(e.toString());
  return null;
}

}

这篇关于Google Flutter登录保持登录状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆