android - 在扩展函数(kotlin)中传递带参数的函数
问题描述
- 我正在尝试
Extension function
使用 Handlers 在 android 中创建一个但面临问题:
扩展趣味代码:
fun delayTask(millis: Long, myFunction: (data:String) -> Unit) {
Handler().postDelayed({
myFunction(data) //why error is of data here
}, millis)
}
像这样调用:
delayTask(500, ::function)
- 获取错误未解决的参考:数据
解决方案
data
不是您的高阶函数的参数。它是您的函数参数的参数。所以它不存在让你传递给传递的函数。
为了能够将此数据传递给您的 lambda,您需要将其添加为另一个参数:
fun delayTask(millis: Long, data: String, myFunction: (String) -> Unit) {
Handler().postDelayed({
myFunction(data)
}, millis)
}
当你调用它时,你还必须传递数据:
delayTask(500, someDataString, ::function)
通过从函数参数中删除参数,您的函数可以更加通用。然后,您只需将其包装在 lambda 中即可调用具有所需参数数量的任何函数:
fun delayTask(millis: Long, myFunction: () -> Unit) {
Handler().postDelayed({
myFunction()
}, millis)
}
delayTask(500) { myFunction(someData) }
出于性能原因,最好将其设为内联。但是传递的函数必须是,crossinline
因为它被包装在另一个对象中并稍后调用:
inline fun delayTask(millis: Long, crossinline myFunction: () -> Unit) {
Handler().postDelayed({
myFunction()
}, millis)
}
请注意,此功能已postDelayed
在 Android Ktx 中提供core
:
Handler().postDelayed(500L) { someFunction() }
推荐阅读
- javascript - 是否可以获取缩放或其他缩放相关参数的状态更改,以便在 Highcharts 中动态设置 tickInterval?
- mongodb - Mongo ID 到 Meteor Mongo ID
- typescript - 两个属性名称之一
- wordpress - 产品编辑页面需要大量时间才能加载
- javascript - 如何动态识别由使用 JSX 图形绘制的多边形中的线形成的区域
- angular - 列表的Java地图(地图
>) 到 Angular - c# - 更改响应内容类型
- database - 如何在 Razor Pages 中创建从数据库中提取数据的图表?
- operating-system - 读取和写入磁盘所需的时间是否相同?
- javascript - Javascript变量Const.prompts能用吗?