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)
您可以轻松地将功能存储在属性中.最简单的方法:
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)
| 归档时间: |
|
| 查看次数: |
5592 次 |
| 最近记录: |