当onCompleteListener成功时,我想获取一些返回值,但是对于Kotlin和lambda,我不知道。我读了这个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获得的列表。
答案 0 :(得分:0)
我没有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) }
(但是,这可能略有偏离问题范围)。