这是因为就撰写而言,您正在创建一个新的selectTime
每次都是 lambda,因此需要重新组合。如果你通过了setTime
函数作为参考,compose 会知道它是同一个函数,因此不需要重新组合:
Clock(viewModel.timeSelected.value!!, viewModel::setTime)
或者,如果您有更复杂的处理程序,您可以remember https://developer.android.com/jetpack/compose/state#state-in-composables它。双括号 ({{ }}
) 在这里至关重要,因为您需要记住 lambda。
Clock(
date = viewModel.timeSelected.value!!,
selectTime = remember(viewModel) {
{
viewModel.setTimerEnable(it)
}
}
)
我知道它看起来有点奇怪,你可以使用rememberLambda https://gist.github.com/PhilipDukhov/949629d5a45fe524707ee02b55e0338d这将使您的代码更具可读性:
selectTime = rememberLambda(viewModel) {
viewModel.setTimerEnable(it)
}
请注意,您需要将所有可能更改的值作为键传递,因此remember
将根据需要重新计算。
一般来说,重组并不是一件坏事。当然,如果您可以减少它,您应该这样做,但是即使您的代码被重组很多次,它也应该可以正常工作。例如,您不应该在可组合项内部进行大量计算来执行此操作,而是使用副作用 https://developer.android.com/jetpack/compose/side-effects.
所以如果重新组合Clock
导致奇怪的 UI 效果,可能是你的有问题NumberClock
无法在重组中幸存下来。如果是这样,请添加NumberClock
针对您的问题编写代码以获取有关如何改进它的建议。