小编Raf*_* V.的帖子

如何正确处理 FirebaseAuth 异步结果?

在我的 Android 应用程序上,我尝试使用 FirebaseAuth 实现简单的登录/注册。我想使用 Kotlin 协程来正确处理来自 Firebase 的响应。所以我将其添加到我的 gradle 文件中:

"org.jetbrains.kotlinx:kotlinx-coroutines-play-services:$kotlin_play_services_version"
Run Code Online (Sandbox Code Playgroud)

之后,我可以.await()在 FirebaseAuth 请求后进行调用。这是负责处理登录的代码:

override suspend fun signIn(email: String, password: String): JobResult<User> {

    var errorMessage = ""
    var user: User? = null

    firebaseAuth.signInWithEmailAndPassword(email, password)
        .addOnSuccessListener { result ->
            user = UserMapper().mapFromFirebaseUser(result.user)
        }
        .addOnFailureListener { result ->
            errorMessage = result.message ?: CONSTANTS.BAD_REQUEST
            user = null
        }.await()

    user?.run {
        return JobResult.Success(this)
    }
    return JobResult.Fail(errorMessage, HttpURLConnection.HTTP_BAD_REQUEST)

}
Run Code Online (Sandbox Code Playgroud)

所以基本上发生的事情是我调用 Firebase 的 Sign In 方法传递正确的参数,并添加成功和失败侦听器。根据结果​​,变量user可能包含用户的信息或为空。根据该变量,我将成功或失败结果返回到请求它的代码部分。

如果结果为正(成功侦听器),则一切正常,但是,如果结果不是成功结果,则.await()永远不会执行调用后的代码!仿佛在等待一个成功的结果,并且会永远等待。这意味着如果请求由于某种原因失败,该挂起函数将永远不会返回任何结果,它只是等待。

我希望收到任何结果后立即运行其余代码。我该怎么做?我在这里遗漏了一些明显的东西吗?是否有任何方法可以“突破”这一点await() …

android async-await firebase-authentication kotlin-coroutines

2
推荐指数
1
解决办法
890
查看次数