Reputation: 3284
I'm starting developing in Android with kotlin and I have a problem with lambdas. I have a function to set a listener in my view, this looks like this:
fun setListener(listener: () -> Unit) {
}
The problem is that the code passed as lambda won't be executed in setListener function, it will be executed in another part of my code (specifically when an item of a spinner is selected) so I have to "save" or "store" this lambda into a variable/property so that I'm able to execute it when needed. Any idea about how to do it?
Edit: I've achieved it by doing:
private var listener: (() -> Unit)? = null
fun setListener(listener: () -> Unit) {
this.listener = listener
}
Is there a better way to do it? Thanks
Upvotes: 23
Views: 20091
Reputation: 257
Here is a simple example.
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;
}
Upvotes: 1
Reputation: 6363
You can store a function in a property easily. The simplest way:
var listener: (() -> Unit)? = null
Usage:
foo.listener = { println("called") }
If you want your property to be set-only, you can create one public property with unusable getter and one private property for internal use. Full example:
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()
}
}
Upvotes: 14
Reputation: 2221
Here's how you can do it:
class Foo {
private var listener: () -> Unit = {}
fun setListener(listener: () -> Unit) {
this.listener = listener
}
}
However, manually writing setters is discouraged in Kotlin. Instead, you can just make your property public:
class Foo {
var listener: () -> Unit = {}
}
For reference, here are the docs about properties with lots of examples.
Upvotes: 24