0Pricing
Android Academy · 课时

状态提升

向上提升状态以实现可复用的可组合项

状态提升 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 remember 和 mutableStateOf 管理状态
  2. 重组详解
  3. 状态提升
  4. rememberSaveable
← 返回 Android Academy