首页 > 解决方案 > 使用 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 获得的列表。

标签: firebaselambdakotlin

解决方案


我没有 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 使用withorapply来“简化” var something = initial(); doSth(something); return somethinginto return with (initial()) { doSth(this); this }or的调用return initial().apply { doSth(this) }(但是,这可能稍微超出了问题的范围)。


推荐阅读