firebase - 持久化用户身份验证 Flutter Firebase
问题描述
我在 Flutter 中使用 Firebase 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
}
}
这是我调用身份验证检查的起始页面。
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 的方法不起作用。
尝试调整您的代码以使用onAuthStateChanged
.
基本上,在您的 Auth 状态下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();
},
);
}
推荐阅读
- listview - Xamarin 列表视图在滚动视图中时未显示完整项目
- python - 从列表中删除重复项 - “TypeError:'Series' 对象是可变的,因此它们不能被散列。”
- javascript - 如何使用阅读模式和 JAVA 启动嵌入在网络浏览器中的 pdf 文件
- php - 从php中的复选框保存多个值
- c# - 如何比较(大于小于)未知类型的对象?
- android - 为什么我在 Xamarin 中找不到我的参考资料并且 Google Map 不显示?
- python - python:什么停止垃圾收集
- c# - 如何使用按钮设置启动/加载表单
- ios - react-native-elements 按钮背景颜色不起作用
- python - 在虚拟环境中找不到 contextlib