Котлин лямбда-функция с аргументами - PullRequest
0 голосов
/ 25 сентября 2018

В настоящее время я разрабатываю приложение для Android, которое использует библиотеку Retrofit для использования API REST.

Например, у меня есть следующий код из 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 в качестве параметралямбда-функция обратно в MainAcativity.kt.Из MainActivity.kt лямбда-функция будет использовать эту информацию для выполнения какой-то конкретной задачи.

Это способ определения лямбда-функции, подобной этой, с аргументами?Если это так, как я могу передать лямбда-функцию в качестве параметра, как это сделано в следующей строке:

calls.userLogin(body) { updateUiComponents() }

Спасибо!

1 Ответ

0 голосов
/ 25 сентября 2018

Не знаю, понял ли я, в чем твоя проблема, но лямбда не должна иметь никаких параметров.Вы можете легко сделать что-то вроде

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()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...