我已经实施了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制作相同的内容?
我个人在稳定通道中发布颤振后没有试过这个,但你可以存储从auth令牌中获得的用户信息。
另外看看这个:https://medium.com/flutterpub/flutter-how-to-do-user-login-with-firebase-a6af760b14d5
检查google_sign_in example,下面的代码段可能是解决问题的关键。
@override
void initState() {
super.initState();
_googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) {
setState(() {
_currentUser = account;
});
if (_currentUser != null) {
_handleGetContact();
}
});
_googleSignIn.signInSilently();
}
我已经实现并测试了它,它按预期工作。