Изменение анонимной функции для вызова другой анонимной функции в Kotlin - PullRequest
0 голосов
/ 05 июня 2018

У меня есть несколько прослушивателей кликов в моем коде, как показано ниже:

tvLogin.setOnClickListener {
    hideKeyBoard(it)
    login()
}

tvForgotPassword.setOnClickListener {
    hideKeyBoard(it)
    navigateToForgetPassword()
}

Я хочу изменить переданный блок кода, чтобы всегда вызывать hideKeyBoard(view), а затем мою функцию.

IsЕсть ли способ создать функцию более высокого порядка, которая будет изменять блок кода и вызывать переданную функцию?

Я пробовал что-то вроде ниже:

val clickListener: (View,()->Unit) -> Unit 

Но не уверен, как это будет работать.

Может кто-нибудь помочь, как достичь?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вы можете расширить View.OnClickListener и передать ему лямбду:

inner class HideKeyboardClickListener(private val lambda: () -> Unit) : View.OnClickListener {
    override fun onClick(v: View) {
        hideKeyboard(v)
        lambda()
    }
}

И затем установить его так:

tvForgotPassword.setOnClickListener(HideKeyboardClickListener {
    navigateToForgetPassword()
})
0 голосов
/ 05 июня 2018

Я не уверен, что полностью понимаю, что вы имеете в виду, но может быть что-то вроде этого:

fun addCallTo(lambda: (View) -> Unit): (View) -> Unit {
  return { 
    hideKeyboard(it)
    lambda(it)
  }
}

// usage:
tvLogin.setOnClickListener(addCallTo { view -> login() })
...