当onCompleteListener成功时,我想获取一些返回值,但是对于Kotlin和lambdas,我不了解。我读了这个doc。
我正在使用此onCompleteListener从FireStore / Firebase获取数据。
我有这个功能:
fun getRegisters() : MutableList<Register> {
mRegistersFirestoreRef.get()
.addOnCompleteListener(
OnCompleteListener { task ->
when {
task.isSuccessful -> {
val documents = task.result
var registerList : MutableList<Register> = mutableListOf()
for (document: QueryDocumentSnapshot in documents) {
registerList.add(document.toObject(Register::class.java))
}
return@OnCompleteListener registerList
}
else -> {
Log.e("Error", task.exception)
}
}
})
}
当我写
return@OnCompleteListener registerList
IDE说需要单位。
我知道我必须返回Unit以尊重订购功能,因为lambda位于OnCompleteListener内,但是我想返回从OnCompleteListener获得的列表。
最佳答案
我没有Firebase环境,因此无法测试我的代码。但是,就Kotlin语法而言,我认为您可以将registerList
从Lambda范围中拉出,如下所示:
fun getRegisters() : MutableList<Register> {
var registerList : MutableList<Register> = mutableListOf()
mRegistersFirestoreRef.get()
.addOnCompleteListener(
OnCompleteListener { task ->
when {
task.isSuccessful -> {
val documents = task.result
for (document: QueryDocumentSnapshot in documents) {
registerList.add(document.toObject(Register::class.java))
}
}
else -> {
Log.e("Error", task.exception)
}
}
})
return registerList
}
或使用
with
或apply
将var something = initial(); doSth(something); return something
的调用“简化”为return with (initial()) { doSth(this); this }
或return initial().apply { doSth(this) }
(但是,这可能会超出问题范围)。关于firebase - 使用Kotlin Lambda从OnCompleteListener返回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51332156/