@ composable 函数被重新组合
- if one the parameters is changed or
- if one of the parameters is not @Stable/@Immutable
当通过 项时: list< Int>
作为参数, 组合总是重新组合, 不论 list
是不可更改的, 并且无法更改 。 ( list is interformation without @ Stable a注解 em> 。 因此, 任何接受 list<T>
的可合成函数, 都因为参数总是被重新组合, 没有智能重新组合 。
如何将 List<T>
标记为稳定, 所以编译者知道列表是不可更改的, 功能不会因为它而需要重组?
我找到的唯一方式是像 Immmobliable data class ImmobleList<T> (val 项: List<T>)
. Demo (当Child1 重新组合父子、 Child2 和相同列表也重新组合时) : :
class TestActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ComposeBasicsTheme {
Parent()
}
}
}
}
@Composable
fun Parent() {
Log.d("Test", "Parent Draw")
val state = remember { mutableStateOf(false) }
val items = remember { listOf(1, 2, 3) }
Column {
// click forces recomposition of Parent
Child1(value = state.value,
onClick = { state.value = !state.value })
//
Child2(items)
}
}
@Composable
fun Child1(
value: Boolean,
onClick: () -> Unit
) {
Log.d("Test", "Child1 Draw")
Text(
"Child1 ($value): Click to recompose Parent",
modifier = Modifier
.clickable { onClick() }
.padding(8.dp)
)
}
@Composable
fun Child2(items: List<Int>) {
Log.d("Test", "Child2 Draw")
Text(
"Child 2 (${items.size})",
modifier = Modifier
.padding(8.dp)
)
}