Итак, я пытаюсь создать слушателя в Котлине. Я просто хочу передать метод, который будет выполняться позже в моем коде. Нравится:

override fun setButtonClickListener(listener: (text: String) -> Unit) {
    this.listener = listener
}

Но когда я объявляю своего слушателя, я должен объявить это так:

private var listener : (text: String) -> Unit = null!!

В противном случае моя AS будет жаловаться. Но это !! в швах нулевого объекта так странно. Как мне объявить этого слушателя ??

Благодарность!

13
Leandro Borges Ferreira 7 Июл 2017 в 17:03

1 ответ

Лучший ответ

Есть много способов объявить функцию как переменную в kotlin.

Вы можете использовать свойства lateinit для инициализации свойства позже, для пример:

private lateinit var listener : (text: String) -> Unit

ИЛИ сделать listener допускающим значение NULL, но вы должны вызвать его с помощью безопасный вызов: listener?.handle(...) таким образом:

private var listener : ((text: String) -> Unit)? = null

ИЛИ объявите его с пустой лямбдой, чтобы избежать NPException, например:

private var listener : (String) -> Unit = {}

ИЛИ объявить частную функцию, а затем на нее можно будет ссылаться с помощью выражение ссылки на функцию, например:

private var listener = this::handle

private fun handle(text:String) = TODO()

Примечание : при объявлении переменной функции имя параметра указывать необязательно, например:

private var listener : (text:String) -> Unit = TODO()
//                      |--- parameter name is omitted
private var listener : (String) -> Unit = TODO()
26
Community 20 Июн 2020 в 12:12
1
Спасибо! Работаю нормально. Довольно сложно найти это в документации ...
 – 
Leandro Borges Ferreira
7 Июл 2017 в 17:10
Не за что.
 – 
holi-java
7 Июл 2017 в 17:13