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)
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)
| 归档时间: |
|
| 查看次数: |
1109 次 |
| 最近记录: |