You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:06:23