Android=で開発を開始していて、ラムダに問題があります。ビューにリスナーを設定する関数があります。これは次のようになります:
fun setListener(listener: () -> Unit) {
}
問題は、ラムダとして渡されたコードがsetListener関数で実行されず、コードの別の部分で実行されるため(具体的には、スピナーのアイテムが選択されている場合)、「保存」または「保存」する必要があることです。このラムダを変数/プロパティに入れて、必要なときに実行できるようにします。それを行う方法について何か考えはありますか?
編集:私はそれを達成しました:
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
}
}
ただし、Kotlinでは手動でセッターを作成することはお勧めしません。代わりに、プロパティをパブリックにすることができます。
class Foo {
var listener: () -> Unit = {}
}
参考までに、ここに プロパティに関するドキュメント と多くの例を示します。
プロパティに関数を簡単に格納できます。最も簡単な方法:
var listener: (() -> Unit)? = null
使用法:
foo.listener = { println("called") }
プロパティを設定のみにする場合は、使用できないgetterを含む1つのパブリックプロパティと、内部で使用する1つのプライベートプロパティを作成できます。完全な例:
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()
}
}