请考虑下面的代码片段
fun doSomething(){
}
@Composable
fun A() {
Column() {
val counter = remember { mutableStateOf(0) }
B {
doSomething()
}
Button(onClick = { counter.value += 1 }) {
Text("Click me 2")
}
Text(text = "count: ${counter.value}")
}
}
@Composable
fun B(onClick: () -> Unit) {
Button(onClick = onClick) {
Text("click me")
}
}
现在,当按下"Click Me 2"按钮时,B Compose函数将被重新组合,尽管它内部的内容没有任何变化.
Clarification:做点什么是为了演示.如果你坚持要有一个实际的例子,你可以考虑下面B的用法:
B{
coroutinScope.launch{
bottomSheetState.collapse()
doSomething()
}
}
My questions:
- 为什么这个Lamda函数会导致重组
- 修复它的最好方法
我对这个问题的理解
从Compose编译器报告中,我可以看到B是一个可跳过的函数,并且输入onClick是稳定的.起初我认为这是因为A的每一次重组都会重新创建lambda函数,它与以前的不同.这种差异会导致B的重组,但这不是真的,因为如果我在lambda函数中使用其他东西,比如更改状态,它不会导致重组.
我的解决方案
- 如果可能,请使用委托.就像视图模式::做某事或::做某事.不幸的是,这并不总是可能的.
- 请记住,在内部使用lambda函数:
val action = remember{
{
doSomething()
}
}
B(action)
看起来很难看=) 3.以上各项的结合.