Android 如何在Kotlin系统中读取Firestore中的文档

Android 如何在Kotlin系统中读取Firestore中的文档,android,firebase,kotlin,google-cloud-firestore,Android,Firebase,Kotlin,Google Cloud Firestore,我有一个简单的登录/注册/仪表板应用程序,我正在工作。我要做的是,我使用firebase signup注册一个用户,在该调用中,我将该用户信息添加到我的集合中,并成功添加并显示在集合中。当我登录时,新用户将得到验证,为了在dashborad上显示用户名,我想使用当前已验证用户的ID从集合中检索用户名。请看下面的代码: suspend fun getUserData() : User?{ firestoreDB.collection("users").document(auth.curr

我有一个简单的登录/注册/仪表板应用程序,我正在工作。我要做的是,我使用firebase signup注册一个用户,在该调用中,我将该用户信息添加到我的集合中,并成功添加并显示在集合中。当我登录时,新用户将得到验证,为了在dashborad上显示用户名,我想使用当前已验证用户的ID从集合中检索用户名。请看下面的代码:

suspend fun getUserData() : User?{

    firestoreDB.collection("users").document(auth.currentUser!!.uid)
        .get()
        .addOnSuccessListener { documentSnapshot ->
            userInfo = documentSnapshot.toObject(User::class.java)!!
        }
    return userInfo
}
当我调试这段代码时,我发现.addOnSuccessListener中的部分根本没有得到执行。所以,我得到了null作为回报。有人能指出我做错了什么吗

该函数从my viewmodel中调用为:

fun getUserData() = viewModelScope.launch{
    val user= repository.getUserData()
    val username = user?.name
}
我的数据库如下所示:

如果要使用返回Play services任务对象的异步操作的结果创建挂起乐趣,请不要使用addOnSuccessListener。get是异步的,并立即与任务对象一起返回。您将需要一种方法将该任务转换为可以与协同程序一起工作的内容,以怀疑函数的执行,直到任务完成为止

有一个用于此的库:。它将向任务添加一个扩展函数wait,这样您就可以在suspend fun中使用它,也可以使用try/catch来捕获错误。事实上,该页面显示了您将使用的代码模式:

val snapshot = try {
    FirebaseFirestore.getInstance().document("users/$id").get().await()
} catch (e: FirebaseFirestoreException) {
    return@async
}
在您的情况下,更像这样:

return firestoreDB
    .collection("users")
    .document(auth.currentUser!!.uid)
    .get()
    .await()
    .toObject(User::class.java)!!

确保调用者尝试/捕获错误。

您确定从不执行成功侦听器吗?如果您在userInfo=documentSnapshot.toObjectUser::class.java上放置一个断点,并再次在调试器中运行,它是否到达该行?我就是这样检查它的。它没有到达那条线你检查日志输出了吗?您可能也想添加一个失败侦听器,以便检查错误。我没有添加失败侦听器,我将对此进行调查