Android 将lambda存储在kotlin中的变量中

Android 将lambda存储在kotlin中的变量中,android,lambda,kotlin,Android,Lambda,Kotlin,我开始用kotlin开发Android,我对lambdas有一个问题。我有一个函数可以在我的视图中设置侦听器,如下所示: fun setListener(listener: () -> Unit) { } 问题是作为lambda传递的代码不会在setListener函数中执行,它将在我的代码的另一部分中执行(特别是在选择微调器项时),因此我必须将该lambda“保存”或“存储”到变量/属性中,以便在需要时执行它。你知道怎么做吗 编辑:我是通过以下方式实现的: private var li

我开始用kotlin开发Android,我对lambdas有一个问题。我有一个函数可以在我的视图中设置侦听器,如下所示:

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
    }
}
但是,Kotlin不鼓励手动编写setter。相反,您可以将您的财产公开:

class Foo {
    var listener: () -> Unit = {}
}

这里有许多示例供参考。

您可以轻松地将函数存储在属性中。最简单的方法是:

var listener: (() -> Unit)? = null
用法:

foo.listener = { println("called") }
如果只想设置属性,可以创建一个带有不可用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()
    }
}

下面是一个简单的例子

fun main(){
    val result=::sum //function assign to variable (first method)
    val result1: (first: Int, second: Int) -> Int=::sum //function assign to variable (second method)
    print(result(5,6))

}
fun  sum(first:Int,second:Int):Int{
    return first+second;
}

“Getter可见性必须与属性可见性相同”(即,不能使用
private get设置
public
)。我建议
var-listener:()->Unit={}
。使用此代码时,在我的class@aloj我已经预兆并澄清了我的答案。如果仍然出现错误,请发布错误消息。您可以使用
private get()=…
将getter设置为private。然后您甚至不需要
\u listener
属性。@diesieben07您不能将setter可见性设置为低于getter可见性。