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

使用requireActivity()传递Fragment Activity时Firebase Auth的onCompleteListener失效

问题分析与解决方案

核心问题根源

  1. 异步操作同步返回错误:Firebase signInWithEmailAndPassword 是异步方法,你的代码在回调执行前就返回了 isLoggedIn,导致返回值永远是初始的 false,且回调内的逻辑无法触发UI更新。
  2. MVP架构职责混乱:Model层持有Activity引用,违反了MVP中Model不依赖UI层的原则,还可能引发内存泄漏。
  3. 接口定义不匹配:修改参数类型为FragmentActivity时,未同步更新Presenter的接口定义,导致方法找不到的错误。

分步修复方案

1. 定义登录回调接口

创建回调接口用于通知Presenter登录结果,避免Model直接依赖UI层:

interface LoginCallback {
    fun onLoginSuccess()
    fun onLoginFailure(error: Exception?)
}

2. 重构UserModel的登录逻辑

移除Activity参数,改用回调传递结果,Firebase默认会在主线程触发回调,无需手动传入Activity:

override fun doLogIn(email: String, password: String, callback: LoginCallback) {
    auth.signInWithEmailAndPassword(email, password)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "signInWithEmail:success")
                callback.onLoginSuccess()
            } else {
                Log.w(TAG, "signInWithEmail:failure", task.exception)
                callback.onLoginFailure(task.exception)
            }
        }
}

3. 更新LoginPresenter的接口与实现

同步修改Presenter的方法定义,去掉返回值和Activity参数,转而传递回调:

// 先更新Presenter接口
interface LoginPresenter {
    fun doLogin(email: String, password: String, callback: LoginCallback)
}

// 实现类代码
override fun doLogin(email: String, password: String, callback: LoginCallback) {
    user.doLogIn(email, password, callback)
}

4. 在Fragment中处理回调并更新UI

调用Presenter时实现回调,完成登录后的UI操作(比如关闭登录表单):

binding.buttonLogin.setOnClickListener {
    loginPresenter.doLogin(email, password, object : LoginCallback {
        override fun onLoginSuccess() {
            // 登录成功,关闭当前登录页面
            requireActivity().finish()
            // 或执行跳转到主页等逻辑
        }

        override fun onLoginFailure(error: Exception?) {
            // 显示登录失败提示
            Toast.makeText(requireContext(), "登录失败:${error?.message}", Toast.LENGTH_SHORT).show()
        }
    })
}

额外注意事项

  • 避免内存泄漏:如果Fragment可能在回调执行前销毁,建议用弱引用包装回调,或在onDestroyView中取消Firebase的任务监听。
  • 实时监听登录状态:可以添加FirebaseAuth.AuthStateListener来监听全局登录状态变化,而不仅仅依赖登录按钮的单次回调。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:48:16