状态提升
向上提升状态以实现可复用的可组合项
状态提升 是 CoddyKit 上的免费 Android Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。
什么是状态提升?
状态提升是指将状态从可组合项中向上移动到调用方。这样,可组合项就变成了无状态组件:它只接收值并报告变化。
有状态与无状态
有状态的可组合项使用 remember 持有自己的状态。无状态的可组合项不持有状态,而是将值作为参数接收,并公开一个事件。无状态可组合项更易于复用和测试。
value + onValueChange 模式
标准的状态提升结构包含两个参数:value(向下传递的当前状态)和 onValueChange lambda(向上传递的事件)。
@Composable
fun NameField(value: String, onValueChange: (String) -> Unit) {
TextField(value = value, onValueChange = onValueChange)
}提升之前
这里的可组合项持有自己的状态。它可以正常工作,但父项无法访问文本,而且该可组合项更难复用。
@Composable
fun NameField() {
var name by remember { mutableStateOf("") }
TextField(value = name, onValueChange = { name = it })
}提升之后
现在状态存在于父项中。字段是无状态且可复用的,父项负责控制该值。
@Composable
fun Parent() {
var name by remember { mutableStateOf("") }
NameField(value = name, onValueChange = { name = it })
}向下传递与向上传递
该模式是状态向下传递,事件向上传递。值作为参数向下传递,变化则通过回调向上传递。这称为单向数据流。
为什么要提升状态?
状态提升可以让多个可组合项共享同一状态,让父项响应变化,并使子项成为输入的纯函数,非常适合预览和测试。
在哪里提升状态
将状态提升到需要它的最低公共祖先。如果只有一个可组合项使用该状态,提升可能没有必要。当上层组件需要读取或控制状态时,再进行提升。
共享状态示例
这里,一个状态同时驱动字段和实时预览。只有提升状态后,才能实现这一点。
@Composable
fun Editor() {
var text by remember { mutableStateOf("") }
Column {
TextField(value = text, onValueChange = { text = it })
Text(text = "Preview: $text")
}
}无状态组件便于复用
由于无状态可组合项将值作为参数接收,您可以使用示例数据预览它,也可以在状态所有者不同的任何地方使用它。
@Preview
@Composable
fun NameFieldPreview() {
NameField(value = "Sample", onValueChange = {})
}整合运用
这是一个可复用的计数器:父项持有计数值,而按钮是无状态的。
@Composable
fun CounterButton(count: Int, onIncrement: () -> Unit) {
Button(onClick = onIncrement) {
Text(text = "Count: $count")
}
}
@Composable
fun Screen() {
var count by remember { mutableStateOf(0) }
CounterButton(count = count, onIncrement = { count++ })
}快速检查
在状态提升中,无状态可组合项通常会公开哪两项内容?
回顾
状态提升:
- 将状态移动到调用方,使子项成为无状态组件。
- 使用
value+onValueChange模式。 - 状态向下传递,事件向上传递 — 单向数据流。
- 将状态提升到需要它的最低公共祖先。
常见问题解答
「状态提升」课时是免费的吗?
是的 — 「状态提升」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。
「状态提升」这节课中我会学到什么?
向上提升状态以实现可复用的可组合项 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Android Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「状态提升」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Android Academy 课中编写并运行代码吗?
能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。