Flutter Firebase Auth无法记住登录用户 应用重启需重复登录
问题根源
Firebase Auth默认确实会持久化存储登录状态,你遇到的问题是应用启动时没有检查已保存的登录状态,直接将登录页设为了默认首页,和Firebase Auth本身的持久化能力无关。
解决方案
1. 修改main.dart的首页路由逻辑
使用StreamBuilder监听Firebase Auth的登录状态变更,应用启动时自动判断是否有已登录的用户:
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return ChangeNotifierProvider( create: (ctx) => Products(), child: MaterialApp( title: 'LearnOn', debugShowCheckedModeBanner: false, theme: ThemeData.light(), darkTheme: ThemeData.dark(), themeMode: currentTheme.currentTheme(), // 替换原有固定的LoginScreen首页 home: StreamBuilder( stream: FirebaseAuth.instance.authStateChanges(), builder: (context, AsyncSnapshot<User?> snapshot) { // Firebase初始化加载阶段显示加载动画 if (snapshot.connectionState == ConnectionState.waiting) { return const Scaffold(body: Center(child: CircularProgressIndicator())); } // 存在已登录的用户直接进入首页 if (snapshot.hasData && snapshot.data != null) { return const StartScreen(); } // 未登录才进入登录页 return const LoginScreen(); }, ), routes: { ProductDetail.routeName: (ctx) => ProductDetail(), Settings.routeName: (ctx) => Settings(), WebViewContainer.routeName: (ctx) => WebViewContainer(), Essensplan.routeName: (ctx) => Essensplan(), StartScreen.routeName: (ctx) => StartScreen(), ForgotPassword.id: (context) => ForgotPassword(), SchwarzesBrett.routeName: (ctx) => SchwarzesBrett(), About.routeName: (ctx) => About(), Lehrerkuerzel.routeName: (ctx) => Lehrerkuerzel(), }), ); } }
2. 删除不安全的明文密码存储逻辑
你当前在auth_screen.dart中将用户明文密码存入Hive属于严重安全风险,Firebase Auth已经自动处理了登录状态持久化,完全不需要自行存储账号密码,可以直接删除以下逻辑:
late Box box1变量声明createBox、getdata、login三个方法- 登录按钮onPressed回调中的
login()调用
3. 确认持久化配置(可选)
如果之前手动修改过Firebase Auth的持久化策略,检查是否存在FirebaseAuth.instance.setPersistence(Persistence.NONE)这类关闭持久化的代码,删除即可恢复默认的持久化能力。
内容的提问来源于stack exchange,提问作者Lucas Knötig
相关产品推荐
相关产品推荐

