Firebase邮箱密码认证登出功能失效问题求助
问题:Firebase Auth邮箱密码登录正常,但登出后界面不跳转
使用Firebase Auth邮箱密码认证方式,登录功能正常,但点击登出按钮后界面无变化。调试控制台无报错,但输出以下日志:
D/FirebaseAuth(22582): Notifying id token listeners about a sign-out event. D/FirebaseAuth(22582): Notifying auth state listeners about a sign-out event
相关代码
main.dart
import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'firebase_options.dart'; import 'package:imporved_main_screens/screens/login.dart'; import 'package:imporved_main_screens/screens/loading.dart'; import 'package:imporved_main_screens/screens/dummy_home.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, theme: ThemeData(fontFamily: 'Poppins'), home: StreamBuilder( stream: FirebaseAuth.instance.authStateChanges(), builder: (ctx, snapShot) { if (snapShot.hasData) { return const DummyHome(); //later change this to actual home page screen } if (snapShot.connectionState == ConnectionState.waiting) { return const Loading(); } return const LogInScreen(); }, ), ); } }
dummy_home.dart
import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:imporved_main_screens/theme.dart'; //import 'package:imporved_main_screens/widgets/register_form.dart'; String? _errorMessage; class DummyHome extends StatelessWidget { const DummyHome({super.key}); Future<void> _signOut() async { try { await FirebaseAuth.instance.signOut(); } catch (e) { print('Error signing out: $e'); } } @override Widget build(BuildContext context) { _errorMessage = ModalRoute.of(context)?.settings.arguments as String?; return Scaffold( appBar: AppBar( title: const Text('Home Page'), actions: [ IconButton( onPressed: _signOut, icon: const Icon(Icons.exit_to_app, color: kPrimaryColor), ) ], ), body: const Center( child: Text('Insert grids'), ), ); } }
排查与解决步骤
确认登出操作实际执行
在_signOut方法中添加日志,验证登出是否成功执行,以及当前用户状态:Future<void> _signOut() async { try { await FirebaseAuth.instance.signOut(); print('登出执行完成'); print('当前用户: ${FirebaseAuth.instance.currentUser}'); } catch (e) { print('Error signing out: $e'); } }如果控制台输出
当前用户: null,说明Firebase Auth的登出逻辑正常,问题出在UI监听部分。调整StreamBuilder的判断顺序
原代码中先判断snapShot.hasData再判断connectionState,可能导致状态切换时的逻辑冲突。修改为优先判断连接状态:builder: (ctx, snapShot) { if (snapShot.connectionState == ConnectionState.waiting) { return const Loading(); } if (snapShot.hasData) { return const DummyHome(); } return const LogInScreen(); }确保在状态变化的等待阶段先显示加载页,避免错误判断用户状态。
移除全局变量的干扰
DummyHome中使用的全局变量_errorMessage,在build方法中赋值可能导致不必要的UI重建或状态干扰。建议改为Widget内部参数传递:class DummyHome extends StatelessWidget { final String? errorMessage; const DummyHome({super.key, this.errorMessage}); Future<void> _signOut() async { try { await FirebaseAuth.instance.signOut(); } catch (e) { print('Error signing out: $e'); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Home Page'), actions: [ IconButton( onPressed: _signOut, icon: const Icon(Icons.exit_to_app, color: kPrimaryColor), ) ], ), body: const Center( child: Text('Insert grids'), ), ); } }重启应用清除缓存
有时Flutter热重载会导致状态缓存,尝试完全重启应用,或清除应用缓存后再次测试登出功能。
内容的提问来源于stack exchange,提问作者user22244550
相关产品推荐
相关产品推荐

