2017-07-02 53 views
-2

我在kotlin中挣扎以获得与java中的函数接口相反的功能。我有以下问题。Kotlin函数类型而不是函数接口lambda

class ResultReceiverTest(handler : Handler) : ResultReceiver(handler) { 

    fun onResult(result : (resultCode : Int, resultData: Bundle) -> Unit){ 
     // result() how to receive values from onReceiveResult() method? 
    } 

    override fun onReceiveResult(resultCode: Int, resultData: Bundle){ 
     // how to call onResult from here? 
     // I want to pass resultCode, resultData parameter to onResult function 
    } 
} 

我有以下的情况,首先onReceiveResult被称为那么我想onReceiveResult的paramets到onResult所以的价值,我可以能够通过值传递给result()其正在实施由以下班级。

class StartService { 
    private var resultReceiverTest = ResultReceiverTest(Handler()) 

    init{ 
     resultReceiverTest.onResult({a, b -> something()}) 
    } 


    fun something(){} 
} 

那么,如何从onReceiveResult值传递给onResult?我知道kotlin中的函数接口和匿名类解决方案。但我想用lambda实现它,这对我对lambda的理解也会有所帮助。

回答

1

您可以使用属性来保存处理程序。

class ResultReceiverTest(handler : Handler) : ResultReceiver(handler) { 
    private var resultHandler: ((resultCode : Int, resultData: Bundle) -> Unit)? = null 

    fun onResult(result : (resultCode : Int, resultData: Bundle) -> Unit){ 
     resultHandler = result 
    } 

    override fun onReceiveResult(resultCode: Int, resultData: Bundle){ 
     resultHandler?.invoke(resultCode, resultData) 
    } 
} 
+0

我在第二行'null'看到错误。我无法分配空值。 – UnKnown

+0

找到了解决方案。我不得不将这个类型放在派生类中。 '((resultCode:Int,resultData:Bundle) - > Unit)?' – UnKnown

+0

我如何调用'resultCode'?它显示错误使用显式'?.invoke()' – UnKnown

1

为什么不做这样的事情?在初始化期间提供结果回调:

class ResultReceiverTest(handler: Handler, private val onResult: (Int, Bundle) -> Unit) : ResultReceiver(handler) { 
    override fun onReceiveResult(resultCode: Int, resultData: Bundle) { 
    onResult(resultCode, resultData) 
    } 
} 

// Do it with a function reference 
class StartService { 

    private var resultReceiverTest = ResultReceiverTest(Handler(), this::doSomethingWithResult) 

    fun doSomethingWithResult(resultCode: Int, resultData: Bundle) { 
    println(resultCode) 
    } 
} 

// OR DO IT INLINE 
class StartService { 

    private var resultReceiverTest = ResultReceiverTest(Handler()) { resultCode, resultData -> println(resultCode) } 

} 
+0

我怎么能调用'resultCode'?它显示错误使用明确的'?.invoke()' – UnKnown

+0

什么是错误?上面的代码在Kotlin 1.1.3中编译得很好 – Strelok

+0

对不起,这是错字。我在谈论'resultReceiverTest'函数 – UnKnown