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

Firebase登录登出功能异常:currentUser为空、登出不生效问题求助

问题:Firebase Auth 用户状态切换异常,仅重启应用后生效

代码实现

单例对象 FirebaseUtils

object FirebaseUtils {
    val auth: FirebaseAuth = FirebaseAuth.getInstance()
    val currentUser: FirebaseUser? = auth.currentUser
}

登录页面登录函数

fun login(){
    val email = binding.loginInput.text.toString()
    val password = binding.passwordInput.text.toString()
    auth.signInWithEmailAndPassword(email, password)
        .addOnCompleteListener {
            task ->
            if (task.isSuccessful){
                task.result
                Log.d("login_status", "Logged: ${currentUser?.uid}")
                startActivity(Intent(this, MainActivity::class.java))
                finish()
            } else {
                Log.d("login_status", task.exception.toString())
            }
        }
}

启动页逻辑

lifecycleScope.launch {
        delay(2000)
        if(currentUser?.uid != null){
            Log.d("login_status", "Logged: ${currentUser.uid}")
            startActivity(Intent(applicationContext, MainActivity::class.java))
        }else{
            startActivity(Intent(applicationContext, LoginMainActivity::class.java))
        }
        finish()
    }

登出函数

fun signOut(){
    auth.signOut()
    startActivity(Intent(this, LoginMainActivity::class.java))
    Log.d("login_status", "Signed out: ${currentUser?.uid}")
    finish()
}

问题现象

  • 首次登录后,打印的currentUser为null,导致应用崩溃;但重启应用后,用户已正常登录。
  • 执行登出操作后,页面跳转到登录页,但输入其他账号登录后,用户仍为原账号,只有重启应用才会切换用户状态。
  • 补充:登录/登出后重启应用,状态均能正常识别。

问题原因与解决方法

核心问题

你在FirebaseUtils单例中定义的currentUser是初始化时一次性赋值的,它不会自动同步Firebase Auth的用户状态变化。

单例对象在应用启动时就会初始化,此时auth.currentUser可能是null(首次启动未登录);当你登录/登出后,Firebase Auth的用户状态已经改变,但单例里的currentUser还是保持着初始化时的旧值,所以页面切换时读取到的依然是旧状态,只有重启应用重新初始化单例,才能拿到新的用户状态。

修复方案

把currentUser改成动态获取的属性,每次调用时都从auth中实时获取最新值:

object FirebaseUtils {
    val auth: FirebaseAuth = FirebaseAuth.getInstance()
    // 改用getter方法,每次调用都获取最新的currentUser
    val currentUser: FirebaseUser?
        get() = auth.currentUser
}

额外优化建议

  1. 登录成功后直接使用返回的用户数据:在signInWithEmailAndPassword的成功回调里,直接用task.result?.user获取当前登录的用户,而不是依赖currentUser,确保拿到最新的登录状态:
if (task.isSuccessful){
    val loggedInUser = task.result?.user
    Log.d("login_status", "Logged: ${loggedInUser?.uid}")
    startActivity(Intent(this, MainActivity::class.java))
    finish()
}
  1. 监听Auth状态变化:如果需要在用户状态变化时自动更新UI或页面,可以注册Firebase Auth的状态监听器,实时响应登录/登出事件:
// 在Activity的onCreate中注册监听器
val authStateListener = FirebaseAuth.AuthStateListener { auth ->
    val user = auth.currentUser
    if (user != null) {
        // 用户已登录,处理逻辑
    } else {
        // 用户已登出,处理逻辑
    }
}

FirebaseUtils.auth.addAuthStateListener(authStateListener)

// 在onDestroy中移除监听器,避免内存泄漏
override fun onDestroy() {
    super.onDestroy()
    FirebaseUtils.auth.removeAuthStateListener(authStateListener)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:15:26