当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
}

或使用withapplyvar 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/

10-10 18:59