带参数的Kotlin Lambda函数

时间:2018-09-25 15:12:01

标签: android lambda kotlin

我目前正在开发一个Android应用程序,该应用程序将Retrofit库用于REST api的使用。

例如,我从MainActivity.kt获得以下代码:

fun userLogin(){
    calls.userLogin() { updateUiComponents() }
    }

fun updateUiComponents(){
    Toast.makeText(applicationContext, "LAMBDA EXECUTED",Toast.LENGTH_SHORT).show()
    }

我在一个单独的文件中有Retrofit调用的定义:

fun userLogin(postActionMethod: () -> Unit){
    val call = service.userLogin()
    call.enqueue(object : Callback<LoginResponse>{
        override fun onFailure(call: Call<LoginResponse>?, t: Throwable?) {
            Log.i("ERROR RUNNING CALL", t?.message.toString())
        }

        override fun onResponse(call: Call<LoginResponse>?, response: Response<LoginResponse>?) {
            postActionMethod()
        }
    })
}

实现Retrofit调用并成功完成后,到达onResponse方法,我想将Response对象作为lambda函数的参数发送回MainAcativity.kt。在MainActivity.kt中,lambda函数将使用此信息来执行某些特定任务。

这是一种通过参数定义lambda函数的方法吗?如果是这样,我如何像以下行中那样将lambda函数作为参数传递:

calls.userLogin(body) { updateUiComponents() }

谢谢!

1 个答案:

答案 0 :(得分:2)

我不知道我是否能解决您的问题,但是lambda不需要任何参数。您可以轻松地执行类似的操作

fun userLogin(postActionMethod: (Response<LoginResponse>?) -> Unit){
    val call = service.userLogin()
    call.enqueue(object : Callback<LoginResponse>{
        override fun onFailure(call: Call<LoginResponse>?, t: Throwable?) {
            Log.i("ERROR RUNNING CALL", t?.message.toString())
        }

        override fun onResponse(call: Call<LoginResponse>?, response: Response<LoginResponse>?) {
            postActionMethod(response)
        }
    })
}

所以您可以用它

fun userLogin(){
    calls.userLogin() { updateUiComponents(it) }
    }

fun updateUiComponents(response: Response<LoginResponse>?){
    Toast.makeText(applicationContext, "LAMBDA EXECUTED",Toast.LENGTH_SHORT).show()
    }