firebase - 使用 Kotlin Lambda 从 OnCompleteListener 返回
问题描述
当 onCompleteListener 成功时,我想获得一些返回值,但是使用 Kotlin 和 lambdas 我不明白。我读了这个文档。
我正在使用这个 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 以尊重 order 函数,并且因为 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
}
or 使用with
orapply
来“简化” var something = initial(); doSth(something); return something
into return with (initial()) { doSth(this); this }
or的调用return initial().apply { doSth(this) }
(但是,这可能稍微超出了问题的范围)。
推荐阅读
- ssl - 在服务于不同域的 apache 虚拟主机之间共享 SSL 配置
- python - Python 单维和多维列表在 CSV 中显示为完整记录
- vhdl - 带溢出检测的 vhdl 32 位加法和减法(有符号数)
- python - Google Style Python Docstrings:多种类型的字典
- javascript - 如何配置音乐播放器播放/暂停/下一个功能才能工作?(仅限 JavaScript)
- node.js - 如何使用 NodeJS 和 MongoDB 实现正确的 Redis
- java - 如何使类对象中的构造函数对象可以应用于给定类型?
- php - 转换 php 会话以做出反应
- javascript - 无法在放大托管添加中添加托管 - 找不到应用程序
- laravel - 无法更新 Laravel 8.48.0 以上版本