【发布时间】:2021-06-04 05:08:52
【问题描述】:
我有一个从 Firebase Firestore 检索值的简单函数。我想返回值。如何让函数等到检索到值,而不是立即返回空值?
请仅使用 Kotlin。
fun fireStoreGetter(keyVal: String): String {
Log.d("FIRESTORE_OP", "fGet running with keyVal: " + keyVal)
//logs: FIRESTORE_OP: fGet running with keyVal: exampleString
var userId :String = ""
var mFirebaseDatabaseInstances = FirebaseFirestore.getInstance()
val user = FirebaseAuth.getInstance().currentUser
if (user != null) {
userId = user.uid
//Log.e(TAG, "User data is null")
} else {
Log.d("FIRESTORE_OP", "MUST AUTHENTICATE TO ACCESS FIRESTORE")
}
Log.d("FIRESTORE_OP", "USER IN WITH UID: " + userId)
//logs FIRESTORE_OP: USER IN WITH UID: DGGiDibnldhP5z6iUyf_GQ
val docRef2 = mFirebaseDatabaseInstances.collection("users").document(userId).collection("dBase").document("exampleDoc")
docRef2.get()
.addOnSuccessListener { document ->
//for (document in result) {
if (document != null) {
//docVal is instantiated in main thread
docVal = document.getString(keyVal).toString()//String(keyVal)
Log.d("FIRESTORE_OP", "DOCVAL SET: " + docVal)
//logs: FIRESTORE_OP: DOCVAL SET: (correct value from firestore)
}
}
Log.d("FIRESTORE_OP", "RETURNING fGet: " + "VALUE: " + docVal)
//logs: FIRESTORE_OP: RETURNING fGet: VALUE:
return docVal
//returns empty
}
【问题讨论】:
-
你需要使用回调接口。或者如果你使用 Kotlin 协程,你可以通过
suspendCoroutine来完成。 -
@a_local_nobody,OP 明白为什么 value 是空的,他问如何等待他的监听器执行
-
@VictorCold 不记得说什么了,这就是为什么它是一个问答帖子来解释如何解决它
-
您无法通过方法返回
docVal。 Firebase API 是异步的。因此,请检查副本以了解如何使用自定义回调解决此问题。正如 Kamal Nayan 在他的评论中已经提到的那样,您也可以使用 Kotlin Coroutine 来实现这一点。
标签: android kotlin asynchronous google-cloud-firestore