在扩展函数中传递带参数的函数(kotlin)

And*_*Dev -2 android kotlin kotlin-extension

  • 我正在尝试Extension function使用处理程序在 android 中创建一个,但面临问题:

扩展乐趣代码:

fun delayTask(millis: Long, myFunction: (data:String) -> Unit) {
    Handler().postDelayed({
        myFunction(data)    //why error is of data here
    }, millis)
}
Run Code Online (Sandbox Code Playgroud)

像这样调用:

 delayTask(500, ::function)
Run Code Online (Sandbox Code Playgroud)
  • 获取错误未解决的参考:数据

Ten*_*r04 5

data不是您的高阶函数的参数。它是您的函数参数的参数。所以你不存在传递给传递的函数。

为了能够将此数据传递给您的 lambda,您需要将其添加为另一个参数:

fun delayTask(millis: Long, data: String, myFunction: (String) -> Unit) {
    Handler().postDelayed({
        myFunction(data)
    }, millis)
}
Run Code Online (Sandbox Code Playgroud)

当你调用它时,你还必须传递数据:

delayTask(500, someDataString, ::function)
Run Code Online (Sandbox Code Playgroud)

通过从函数参数中删除参数,您的函数可以更加通用。然后,您可以通过将其包装在 lambda 中来调用具有所需参数数量的任何函数:

fun delayTask(millis: Long, myFunction: () -> Unit) {
    Handler().postDelayed({
        myFunction()
    }, millis)
}

delayTask(500) { myFunction(someData) }
Run Code Online (Sandbox Code Playgroud)

出于性能原因,最好使其内联。但是传递的函数必须是,crossinline因为它被包装在另一个对象中并稍后调用:

inline fun delayTask(millis: Long, crossinline myFunction: () -> Unit) {
    Handler().postDelayed({
        myFunction()
    }, millis)
}
Run Code Online (Sandbox Code Playgroud)

请注意,此功能已与 Android Ktx 中的postDelayed 功能一起使用core

Handler().postDelayed(500L) { someFunction() }
Run Code Online (Sandbox Code Playgroud)