Firebase Auth调用getCurrentUser()返回null但控制台存在对应用户问题
问题根因
你遇到的currentUser == null但控制台存在用户数据的核心原因有两个:
- Firebase Auth SDK的
currentUser是同步读取本地缓存的,你在Fragment的onStart生命周期直接调用删除逻辑时,SDK还没完成远端用户状态的同步校验,此时本地缓存还没更新为第二次新注册的用户数据,就会返回空值。 - 第一次调用
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
相关产品推荐
相关产品推荐

