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