使用firebase_dart如何实现应用重启后自动保持登录状态
firebase_dart 跨端登录状态持久化实现方案
你遇到的重启应用登录状态丢失问题,根本原因是firebase_dart的FirebaseAuth默认使用内存持久化(MemoryPersistence),所有身份凭证仅存于应用运行内存,进程被杀后数据直接清空,并非需要你手动零散存储idToken、refreshToken等字段,按照以下步骤配置即可实现自动持久化:
实现步骤
1. 添加前置依赖
全平台本地键值存储使用shared_preferences即可兼容iOS、Android、macOS、Linux、Windows全端,在pubspec.yaml中添加依赖:
dependencies: shared_preferences: ^2.2.2 firebase_dart: 保持你当前使用的版本即可
2. 实现自定义持久化类
firebase_dart暴露了Persistence抽象接口,只需要实现三个读写方法,不需要关心具体存储的凭证字段内容,插件内部会自动处理凭证序列化、token自动刷新逻辑:
import 'dart:convert'; import 'package:firebase_dart/firebase_dart.dart'; import 'package:shared_preferences/shared_preferences.dart'; class SpPersistence extends Persistence { static const _storeKey = 'firebase_auth_local_credential'; final SharedPreferences _prefs; SpPersistence(this._prefs); // 启动时读取本地凭证 @override Future<Map<String, dynamic>?> get() async { final rawData = _prefs.getString(_storeKey); return rawData == null ? null : json.decode(rawData) as Map<String, dynamic>; } // 登录/凭证刷新时自动写入本地 @override Future<void> set(Map<String, dynamic> credentialData) async { await _prefs.setString(_storeKey, json.encode(credentialData)); } // 登出时自动清空本地凭证 @override Future<void> remove() async { await _prefs.remove(_storeKey); } }
3. 初始化Auth时传入持久化实例
注意不要使用默认的无参初始化,必须在应用启动初始化Firebase时,将你实现的持久化实例传给FirebaseAuth,替换默认的内存持久化:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 提前初始化SharedPreferences final prefs = await SharedPreferences.getInstance(); // 初始化Firebase核心 FirebaseDart.setup(); final firebaseApp = await Firebase.initializeApp( options: const FirebaseOptions( // 替换为你自己项目的Firebase配置参数 apiKey: "你的项目apiKey", authDomain: "你的项目authDomain", databaseURL: "你的项目databaseURL", projectId: "你的项目projectId", storageBucket: "你的项目storageBucket", messagingSenderId: "你的项目messagingSenderId", appId: "你的项目appId", ), ); // 初始化Auth时绑定持久化 final auth = FirebaseAuth.instanceFor( app: firebaseApp, persistence: SpPersistence(prefs), ); runApp(MyApp(auth: auth)); }
后续使用注意事项
- 不需要手动存储
signInWithEmailAndPassword返回的UserCredential内的任何字段,插件会自动在登录、token刷新时更新本地存储的凭证,过期token会自动通过refreshToken续期,无需额外处理。 - 应用启动后直接监听
auth.authStateChanges()流即可判断登录状态:流返回非空User对象说明本地凭证有效,可直接进入应用主页;返回null则跳转登录页即可。 - 用户主动调用
auth.signOut()时,插件会自动调用持久化类的remove()方法清空本地凭证,下次启动会回到未登录状态,不需要手动清理存储。
内容的提问来源于stack exchange,提问作者DirtyNative
相关产品推荐
相关产品推荐

