Flutter google sign in stay logged in

孤者浪人 提交于 2020-07-08 03:06:15

问题


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 (OLD)

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 (NEW)

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;
});
}
}

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?


回答1:


Check the google_sign_in example , the snippet below may be the key to solve your problem.

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

I've implemented and tested it, and it works as expected.




回答2:


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;
}

}




回答3:


I personally haven't tried this after the release of flutter in stable channel but you could just store the user info obtained from the auth tokens.

Also take a look at this: https://medium.com/flutterpub/flutter-how-to-do-user-login-with-firebase-a6af760b14d5



来源:https://stackoverflow.com/questions/54213860/flutter-google-sign-in-stay-logged-in

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!