【问题标题】:OnCompleteListener Triggers After Return Statement返回语句后的 OnCompleteListener 触发器
【发布时间】:2020-01-10 19:10:16
【问题描述】:

我想在 MVVM 模式中使用 firebase 身份验证,我正在使用 ViewModels 和 LiveData 来尝试了解它是如何工作的。

我很难理解为什么会发生以下情况:

在我的 repository 中,我尝试使用电子邮件和密码登录,并根据结果简单地返回一个 String(我最终会将其更改为用户对象)

        fun loginUser (email: String, password: String): String {
        firebaseAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener{ authTask ->
            if (authTask.isSuccessful) {
                randomString = "Signed in!!"

            } else randomString = "Sign in failed!"  // 2. This happens after randomString is returned
        }
        return randomString // 1. Returns this first, so returning default value
    }

所以我希望这会返回“已登录!!”或“登录失败!”但 randomString 是默认值并在返回后更新 ..

【问题讨论】:

    标签: android firebase kotlin mvvm firebase-authentication


    【解决方案1】:

    signInWithEmailAndPassword 是异步的,会立即返回一个 Task 对象。当您向其添加侦听器时,该回调将在操作完成后的一段时间后调用。您的return 语句实际上是在登录结果可用之前返回randomString 的初始值。

    如果您使用的是 Android Jetpack 组件,您应该做的是返回您自己的 LiveData 实现,该实现会在完成时发出登录结果。调用者可以通过自己的回调观察 LiveData 以了解它何时完成。

    【讨论】:

    • 谢谢你,Doug - 我很荣幸(我最近才在 youtube 上看你!).. 但是,我有:一个 Fragment,它在 ViewModel 中观察一个 LiveData 对象,现在我需要一个 ViewModel 来观察 Repository 中的 LiveData。对于后者,我不能像在 Fragment 中那样设置 LifeCycleOwner(我认为这样做是个问题!?
    • 当然,如果你愿意,可以使用 ViewModel。 LiveData 不需要使用 ViewModel,但它是 Android MVVM 中的常见模式。
    • 我的帖子已经过审核(希望这条评论没问题!),但为了完整起见,我在这里更新了我的问题并提供了解决方案:*.com/questions/59874102/…
    最近更新 更多