Я начинаю развиваться в Android с kotlin, и у меня проблема с лямбдами. У меня есть функция установки слушателя в моем представлении, это выглядит так:
fun setListener(listener: () -> Unit) { }
Проблема в том, что код, переданный как lambda, не будет выполняться в функции setListener, он будет выполнен в другой части моего кода (в частности, когда выбран элемент спиннера), поэтому мне нужно «сохранить» или «сохранить», эта lambda в переменную / свойство, чтобы я мог ее выполнить, когда это необходимо. Любая идея о том, как это сделать?
Изменить: я достиг этого, выполняя:
private var listener: (() -> Unit)? = null fun setListener(listener: () -> Unit) { this.listener = listener }
Есть ли лучший способ сделать это? благодаря
Вот как вы можете это сделать:
class Foo { private var listener: () -> Unit = {} fun setListener(listener: () -> Unit) { this.listener = listener } }
Тем не менее, в Котлине не поощряются ручные установки. Вместо этого вы можете просто сделать вашу собственность открытой:
class Foo { var listener: () -> Unit = {} }
Для справки, вот документы о свойствах с большим количеством примеров.
Вы можете легко сохранить функцию в свойстве. Самый простой способ:
var listener: (() -> Unit)? = null
Применение:
foo.listener = { println("called") }
Если вы хотите, чтобы ваша собственность была только настроена, вы можете создать одно общедоступное свойство с непригодным получателем и одним закрытым свойством для внутреннего использования. Полный пример:
class Example { // for internal use private var _listener: (() -> Unit)? = null // public set-only var listener: (() -> Unit)? @Deprecated(message = "set-only", level = DeprecationLevel.ERROR) get() = throw AssertionError() // unusable getter set(value) { _listener = value } // write-through setter fun somethingHappend() { _listener?.invoke() } }