在 Composable 中,通常我们使用 function param 来处理事件,例如下面onClickHandler: () -> Unit
在官方文档中,使用 lambda 来调用该onClickHandler
函数。
@Composable
fun FilledButtonExample(onClickHandler: () -> Unit) {
Button(onClick = { onClickHandler() }) {
Text("Filled")
}
}
onClickHandler
如果我们直接将函数赋值给变量是不是更好onClick
?例如Button(onClick = onClickHandler )
@Composable
fun FilledButtonExample(onClickHandler: () -> Unit) {
Button(onClick = onClickHandler ) {
Text("Filled")
}
}
删除多余的lamdba会更好,但对性能的影响可以忽略不计。
让我们运行一个测试,看看这两个变体的编译输出是否真的不同,因为 Kotlin 编译器进行了许多优化以消除冗余。
我构建了两个足以测试该案例的最小代码示例:
Lambda.kt
NoLambda.kt
我们可以使用以下命令编译 Kotlin 文件:
当我们比较输出时,我们看到以下内容:
Lambda 输出
NoLamdba 输出
Kotlin 编译器为每个函数生成一个单独的类文件。因此,通过省略冗余的 lamdba,我们实际上减少了生成的类文件的数量。
但对性能的实际影响将微不足道。
是的,在这些情况下最好直接分配 lambda 参数,因为这是一种更有效的方法,并且避免创建额外的 lambda 层。
当您使用 时
Button(onClick = { onClickHandler() })
,您将包装onClickHandler
一个新的 lambda 表达式,这会产生少量但不必要的代码。通过直接分配onClickHandler
给onClick
方法,您可以避免这种情况,从而使代码更简洁、性能更高。两种方法都是正确的,但当点击处理程序中不需要额外的逻辑时,第二种方法是更有效的 Kotlin 方法。
使用rememberUpdatedState可以防止可组合项功能重新启动,减少重组次数,提高性能。官方文档地址也有介绍: https://developer.android.com/develop/ui/compose/side-effects?hl=es#rememberupdatedstate