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 }
额外优化建议
- 登录成功后直接使用返回的用户数据:在
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() }
- 监听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
相关产品推荐
相关产品推荐

