繁体   English   中英

如何阻止正在调用 firebase 的挂起 function

[英]How to block a suspend function that is calling firebase

在我的AuthRepository ,我试图创建一个将在主线程中异步运行的login function,我使用 firebase auth 来执行此操作,并使用sealed class AuthResult来处理结果 state。

我的问题是,当我尝试返回AuthResult state 时,它将是 null 因为我在.addOnCompleteListener完成之前返回了var authResult: AuthResult = null变量...

这是我的 function:

override suspend fun login(email: String, password: String): AuthResult {
    return try {
        var authResult: AuthResult? = null

        firebaseAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    task.result.user?.let {
                        authResult = AuthResult.Success(it)
                    }
                } else {
                    // exception
                    authResult = AuthResult.Error(message = "An error occurred", task.exception)
                }
            }

        authResult ?: AuthResult.Error(message = "An error occurred null")
    } catch (e: Exception) {
        AuthResult.Error("An error has occurred", e)
    }

}

我在我的LoginViewModel中使用 invoke usecase 调用这个 function :

private val _state = MutableStateFlow<AuthResult?>(null)
val state: StateFlow<AuthResult?> = _state

fun login(email: String, password: String) {
    viewModelScope.launch(Dispatchers.IO) {
        _state.value = loginUseCase(email, password)
    }
}

所以考虑到我的问题state将是:

AuthResult.Error(message = "An error occurred null")

我试图完成的是阻止suspend fun login(...)直到.addOnCompleteListener{}完成...

缺少依赖项,所以我无法使用await()

添加这个:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.0'

然后在.addOnCompleteListener {}之后添加.await()

firebaseAuth.signInWithEmailAndPassword(email, password)
    .addOnCompleteListener { task ->
        ...
    }.await()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM