我正在将Firebase Auth与Google登录Flutter一起使用。我可以登录,但是当我关闭该应用程序(杀死它)时,我必须再次重新注册。那么,有没有一种方法可以坚持用户身份验证,直到用户明确注销为止? 这是我的认证课程
POST: https://vision.googleapis.com/v1/images:annotate?key=<MY_KEY>
BODY:
{
"requests": [
{
"image": {
"content": "...base64-encoded-image-content..."
},
"features": [
{
"type": "TEXT_DETECTION"
}
]
}
]
}
这是我的起始页,其中会调用auth检查。
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
class Auth {
FirebaseAuth _firebaseAuth;
FirebaseUser _user;
Auth() {
this._firebaseAuth = FirebaseAuth.instance;
}
Future<bool> isLoggedIn() async {
this._user = await _firebaseAuth.currentUser();
if (this._user == null) {
return false;
}
return true;
}
Future<bool> authenticateWithGoogle() async {
final googleSignIn = GoogleSignIn();
final GoogleSignInAccount googleUser = await googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth =
await googleUser.authentication;
this._user = await _firebaseAuth.signInWithGoogle(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
if (this._user == null) {
return false;
}
return true;
// do something with signed-in user
}
}
答案 0 :(得分:4)
我相信您的问题是路由。在我的应用程序中,我使用FirebaseAuth
,它的工作原理与您所说的一样,并且我不保留任何登录令牌。但是,我不知道为什么您使用getUser的方法行不通。
尝试调整您的代码以使用onAuthStateChanged
。
基本上,在您的MaterialApp
,创建一个StreamBuilder
听_auth.onAuthStateChanged
并根据验证情况选择你的页面。
See this link,有一个很好的例子。
答案 1 :(得分:1)
添加此代码。应该可以。
FirebaseAuth auth = FirebaseAuth.instance;
auth.setPersistence(Persistence.SESSION);
答案 2 :(得分:1)
void main() {
FirebaseAuth.instance.authStateChanges().listen((User user) {
if (user == null) {
runApp(MyApp(auth : false);
} else {
runApp(MyApp(auth : false);
}
});
}
class MyApp extends StatefulWidget {
final bool auth;
MyApp({this.auth});
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
return MaterialApp(
......
......
home: widget.auth ? MainScreen() : AuthScreen();
);
答案 3 :(得分:0)
即使您终止了该应用程序,也可以使用shared_preferences
来保持会话状态。
这是文档https://pub.dartlang.org/packages/shared_preferences。
我还听说可以使用sqlite来保持会话状态。
答案 4 :(得分:0)
对不起,这是我的错误。忘记将推送登录屏幕放在其他位置。
Future<void> _handleStartScreen() async {
Auth _auth = Auth();
if (await _auth.isLoggedIn()) {
Navigator.of(context).pushReplacementNamed("/chat");
}
else {
Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => LoginScreen(auth: _auth,)));
}
}
答案 5 :(得分:0)
你可以使用我的代码,你可以使用 userChanges() 而不是 authStateChanges()
通知有关任何用户更新的更改。
这是 [authStateChanges] 和 [idTokenChanges] 的超集。它提供有关所有用户更改的事件,例如何时链接、取消链接以及何时对用户配置文件进行更新。此 Stream 的目的是监听用户状态(登录、退出、不同用户和令牌刷新)的实时更新,而无需手动调用 [reload],然后再对您的应用程序进行更改。
final Stream<User?> firebaseUserChanges = firebaseAuth.userChanges();