将lambda存储在kotlin中的变量中

alo*_*loj 10 lambda android kotlin

我开始使用kotlin开发Android,我有一个lambda问题.我有一个函数在我的视图中设置一个监听器,如下所示:

fun setListener(listener: () -> Unit) {
}
Run Code Online (Sandbox Code Playgroud)

问题是作为lambda传递的代码不会在setListener函数中执行,它将在我的代码的另一部分执行(特别是当选择一个微调器的项目时)所以我必须"保存"或"存储"将此lambda转换为变量/属性,以便我能够在需要时执行它.有什么想法怎么做?

编辑:我通过以下方式实现了:

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

fun setListener(listener: () -> Unit) {
    this.listener = listener
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?谢谢

Chr*_*ann 18

这是你如何做到的:

class Foo {
    private var listener: () -> Unit = {}
    fun setListener(listener: () -> Unit) {
        this.listener = listener
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在Kotlin中不鼓励人工编写setter.相反,您可以公开您的财产:

class Foo {
    var listener: () -> Unit = {}
}
Run Code Online (Sandbox Code Playgroud)

作为参考,这里有关于具有大量示例的属性文档.


Mih*_*x64 9

您可以轻松地将功能存储在属性中.最简单的方法:

var listener: (() -> Unit)? = null
Run Code Online (Sandbox Code Playgroud)

用法:

foo.listener = { println("called") }
Run Code Online (Sandbox Code Playgroud)

如果您希望将您的属性设置为仅设置,则可以创建一个具有不可用getter的公共属性和一个供内部使用的私有属性.完整示例:

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()
    }
}
Run Code Online (Sandbox Code Playgroud)