Flutter谷歌登录保持登录状态

问题描述 投票:0回答:2

我已经实施了firebase auth谷歌登录,但我怎么能够在应用程序关闭后保持登录,我甚至把这行await _auth.currentUser()但仍然无法正常工作。以下是我的登录代码。

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

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制作相同的内容?

flutter firebase-authentication google-signin
2个回答
0
投票

我个人在稳定通道中发布颤振后没有试过这个,但你可以存储从auth令牌中获得的用户信息。

另外看看这个:https://medium.com/flutterpub/flutter-how-to-do-user-login-with-firebase-a6af760b14d5


0
投票

检查google_sign_in example,下面的代码段可能是解决问题的关键。

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

我已经实现并测试了它,它按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.