Store lambda in a variable in kotlin

后端 未结 2 1117
孤独总比滥情好
孤独总比滥情好 2021-02-19 00:07

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 setL         


        
相关标签:
2条回答
  • 2021-02-19 00:25

    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()
        }
    }
    
    0 讨论(0)
  • 2021-02-19 00:27

    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.

    0 讨论(0)
提交回复
热议问题