我正在进行Firebase身份验证,其中需要将Firebase身份验证放在我的存储库中。我找到了有关如何执行此操作的文章,但它使用RxJava。 (https://www.simplifiedcoding.net/firebase-mvvm-example/)

现在,我想知道是否只有针对kotlin的解决方案,因为我不想使用RxJava,因为我正在使用kotlin协程。

fun facebookLogin(credential: AuthCredential) = Completable.create { emitter -> // change Completable.create since it is a RxJava
    firebaseAuth.signInWithCredential(credential).addOnCompleteListener { task ->
        if (!emitter.isDisposed) {
            if (task.isSuccessful)
                emitter.onComplete()
            else
                emitter.onError(task.exception!!)
        }
    }
}

最佳答案

Continuation
允许您将同步转换为异步

官方协程代码实验室过去曾对此进行过处理,但他们似乎已将其删除。样板大致如下所示:

suspend fun facebookLogin(...): Boolean {
  return   suspendCoroutine { continuation ->
      firebaseAuth.signInWithCredential(credential).addOnCompleteListener { task ->

            if (task.isSuccessful)
                continuation.resume(true)
            else
                continuation.resumeWith(Result.failure(task.exception))
        }
    }
  }
}

并从ViewModel调用它,您将
fun login () {
   viewModelScope.launch{
      facebookLogin(...)
   }
}

如果不在 View 模型中,则可以始终
CoroutineContext(Dispatchers.IO).launch{
   facebookLogin(...)
}

09-25 18:01
查看更多