使用Kotlin Lambda从OnCompleteListener返回

时间:2018-07-13 20:06:17

标签: firebase lambda kotlin

当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获得的列表。

1 个答案:

答案 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
}

或使用withapplyvar something = initial(); doSth(something); return something的呼叫“简化”为return with (initial()) { doSth(this); this }return initial().apply { doSth(this) }(但是,这可能略有偏离问题范围)。