查看代码实验室的基本教程,有一个片段可以在单击时增加按钮上的计数器
@Composable
fun MyScreenContent(names: List<String> = listOf("Android", "there")) {
val counterState = remember { mutableStateOf(0) }
Column(modifier = Modifier.fillMaxHeight()) {
Column(modifier = Modifier.weight(1f)) {
for (name in names) {
Greeting(name = name)
Divider(color = Color.Black)
}
}
Counter(
count = counterState.value,
updateCount = { newCount ->
counterState.value = newCount
}
)
}
}
@Composable
fun Counter(count: Int, updateCount: (Int) -> Unit) {
Button(
onClick = { updateCount(count + 1) },
colors = ButtonConstants.defaultButtonColors(
backgroundColor = if (count > 5) Color.Green else Color.White
)
) {
Text("I've been clicked $count times")
}
}
很明显 remember { mutableStateOf(0) }
存储状态/值。我的问题是 remember 在幕后做了什么。使用 var count = remember { 0 }
或 mutableStateOf(0)
不 记得 不会增加值。
fun MyScreenContent(names: List<String> = listOf("Android", "there")) {
var count = remember { 0 }
Column(modifier = Modifier.fillMaxHeight()) {
Column(modifier = Modifier.weight(1f)) {
for (name in names) {
Greeting(name = name)
Divider(color = Color.Black)
}
}
Counter(
count = count,
updateCount = { newCount ->
count = newCount
}
)
}
}
上面的代码片段不会更新打印在 Text
上的值,记得只适用于 MutableState
吗?
原文由 Thracian 发布,翻译遵循 CC BY-SA 4.0 许可协议
remember - 允许您记住先前重组调用的状态,仅此而已。因此,例如,如果您在初始运行时随机化颜色。随机颜色将被计算一次,并在需要重新组合时重复使用。
所以…记住 = 存储值以防万一调用 recompose。
现在第二件事是知道什么时候应该真正触发重新组合。并且可变状态会提供帮助。
mutablestate = 存储值,以防万一我更新值触发重组使用此数据的所有元素。