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

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'),
      ),
    );
  }
}

排查与解决步骤

  1. 确认登出操作实际执行
    在_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监听部分。

  2. 调整StreamBuilder的判断顺序
    原代码中先判断snapShot.hasData再判断connectionState,可能导致状态切换时的逻辑冲突。修改为优先判断连接状态:

    builder: (ctx, snapShot) {
      if (snapShot.connectionState == ConnectionState.waiting) {
        return const Loading();
      }
      if (snapShot.hasData) {
        return const DummyHome();
      }
      return const LogInScreen();
    }
    

    确保在状态变化的等待阶段先显示加载页,避免错误判断用户状态。

  3. 移除全局变量的干扰
    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'),
          ),
        );
      }
    }
    
  4. 重启应用清除缓存
    有时Flutter热重载会导致状态缓存,尝试完全重启应用,或清除应用缓存后再次测试登出功能。

内容的提问来源于stack exchange,提问作者user22244550

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:53:30