You need to enable JavaScript to run this app. Firebase Auth调用getCurrentUser()返回null但控制台存在对应用户问题
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Auth调用getCurrentUser()返回null但控制台存在对应用户问题

问题根因

你遇到的currentUser == null但控制台存在用户数据的核心原因有两个:

  1. Firebase Auth SDK的currentUser是同步读取本地缓存的,你在Fragment的onStart生命周期直接调用删除逻辑时,SDK还没完成远端用户状态的同步校验,此时本地缓存还没更新为第二次新注册的用户数据,就会返回空值。
  2. 第一次调用user.delete()异步执行完成后,SDK会自动清空本地的currentUser缓存,第二次注册成功后如果没有显式监听Auth状态变化,本地缓存可能没有及时同步新注册的用户实例,导致读取失败。

解决方案

1. 改用Auth状态监听替代同步读取currentUser

不要在onStart中直接同步读取currentUser,通过AuthStateListener监听SDK的状态同步完成事件后再执行删除逻辑,确保拿到的是最新的用户状态。

2. 临时存储未验证用户的登录凭证(可选兜底)

如果还是存在读取不到currentUser的情况,可以在注册成功跳转验证页时,临时加密存储当前用户的邮箱和密码到本地,删除时如果拿不到currentUser就先执行登录操作,拿到有效用户实例后再删除。

修改后的代码示例

// 定义Auth状态监听器
private val authStateListener = FirebaseAuth.AuthStateListener { auth ->
    val currentUser = auth.currentUser ?: return@AuthStateListener
    if (!currentUser.isEmailVerified) {
        currentUser.delete()
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    shortToast("deleted")
                    // 清除本地存储的临时登录凭证
                    clearTempUserInfo()
                } else {
                    // 兜底逻辑:如果删除失败(比如token过期),用临时存储的账号密码登录后再删
                    val tempEmail = getTempEmail()
                    val tempPwd = getTempPwd()
                    if (tempEmail.isNotEmpty() && tempPwd.isNotEmpty()) {
                        auth.signInWithEmailAndPassword(tempEmail, tempPwd)
                            .addOnSuccessListener { result ->
                                result.user?.delete()?.addOnSuccessListener {
                                    shortToast("deleted")
                                    clearTempUserInfo()
                                }
                            }
                    }
                }
            }
    }
}

override fun onStart() {
    super.onStart()
    // 注册监听器,SDK完成状态同步后会自动回调
    FirebaseAuth.getInstance().addAuthStateListener(authStateListener)
}

override fun onStop() {
    super.onStop()
    // 注销监听器避免内存泄漏
    FirebaseAuth.getInstance().removeAuthStateListener(authStateListener)
}

// 注册成功跳转验证页前调用,临时存储未验证用户信息
private fun saveTempUserInfo(email: String, pwd: String) {
    // 建议用EncryptedSharedPreferences加密存储
    getSharedPreferences("temp_user", Context.MODE_PRIVATE)
        .edit()
        .putString("email", email)
        .putString("pwd", pwd)
        .apply()
}

private fun getTempEmail(): String {
    return getSharedPreferences("temp_user", Context.MODE_PRIVATE)
        .getString("email", "") ?: ""
}

private fun getTempPwd(): String {
    return getSharedPreferences("temp_user", Context.MODE_PRIVATE)
        .getString("pwd", "") ?: ""
}

private fun clearTempUserInfo() {
    getSharedPreferences("temp_user", Context.MODE_PRIVATE)
        .edit()
        .clear()
        .apply()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 19:06:02