我正在将Firebase Auth与Google登录Flutter一起使用。我可以登录,但是当我关闭该应用程序(杀死它)时,我必须再次重新注册。那么,是否有一种方法可以保持用户身份验证,直到用户明确注销为止?这是我的认证课程
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 } }
这是调用身份验证检查的起始页面。
import 'package:flutter/material.dart'; import 'auth.dart'; import 'login_screen.dart'; import 'chat_screen.dart'; class Splash extends StatefulWidget { @override _Splash createState() => _Splash(); } class _Splash extends State<Splash> { @override Widget build(BuildContext context) { return Scaffold( body: Center( child: CircularProgressIndicator( value: null, ), ), ); } @override void initState() { super.initState(); _handleStartScreen(); } Future<void> _handleStartScreen() async { Auth _auth = Auth(); if (await _auth.isLoggedIn()) { Navigator.of(context).pushReplacementNamed("/chat"); } Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => LoginScreen(auth: _auth,))); } }
我相信您的问题是路由。在我的应用程序中,我使用FirebaseAuth它并且它按照您想要的方式工作,并且我不保留任何登录令牌。但是,我不知道为什么您使用getUser的方法行不通。
FirebaseAuth
尝试调整要使用的代码onAuthStateChanged。
onAuthStateChanged
基本上,在您的上MaterialApp,根据Auth状态创建一个StreamBuilder监听_auth.onAuthStateChanged页面并选择您的页面。
MaterialApp
StreamBuilder
_auth.onAuthStateChanged
我将复制并粘贴我的应用程序的一部分,以便您有一个主意:
[...] final FirebaseAuth _auth = FirebaseAuth.instance; Future<void> main() async { FirebaseApp.configure( name: '...', options: Platform.isIOS ? const FirebaseOptions(...) : const FirebaseOptions(...), ); [...] runApp(new MaterialApp( title: '...', home: await getLandingPage(), theme: ThemeData(...), )); } Future<Widget> getLandingPage() async { return StreamBuilder<FirebaseUser>( stream: _auth.onAuthStateChanged, builder: (BuildContext context, snapshot) { if (snapshot.hasData && (!snapshot.data.isAnonymous)) { return HomePage(); } return AccountLoginPage(); }, ); }