📘 状态管理概述

从入门到精通 第1章 · 核心思想

🎒 在 Compose 的世界里,状态 就像书包里的文具 —— 你随时需要,也要知道怎么整理。 这一节我们从零理解“什么是状态”、“为什么需要管理”以及 Compose 的核心理念。

📌 1. 什么是状态

状态 (State) 是 UI 中任何随时间变化的数据。在 Android Compose 中,状态决定了界面长什么样。

生活中的例子Compose 中的状态
📱 手机音量var volume by remember { mutableStateOf(50) }
✅ 复选框勾选var isChecked by remember { mutableStateOf(false) }
📝 输入框文字var text by remember { mutableStateOf("") }
🔄 网络加载中var isLoading by remember { mutableStateOf(true) }

简单来说:状态 = 数据 + 变化。当状态改变,Compose 会自动重新绘制相关的 UI 部分。

🧩 2. 为什么需要状态管理

没有管理的状态就像散落的积木 —— 能搭,但一碰就倒。来看几个痛点:

而好的状态管理能带来:

✅ 单一数据源 ✅ 可预测更新 ✅ 高效重组 ✅ 逻辑与 UI 分离

⚛️ 3. Compose 状态管理核心思想

Compose 采用 声明式 + 观察者模式。核心公式:

UI = f(State)

界面是状态的函数,状态变化 → UI 自动更新

🔹 核心原则

🎯 Compose 状态管理核心思想 📦 状态 State mutableStateOf / StateFlow 读取 🖥️ UI Composable 函数 重组 · 渲染 事件 / 交互 🧠 逻辑层 / ViewModel 状态提升 · 业务逻辑 更新状态 ♻️ 自动重组

📄 代码示例:状态提升 & 单向数据流

下面展示一个简单的 计数器,体现 Compose 状态管理风格:

// 可复用的无状态组件 —— 只负责展示
@Composable
fun CounterDisplay(
    count: Int,               // 👈 状态提升到外部
    onIncrement: () -> Unit,  // 👈 事件向上传递
    onReset: () -> Unit
) {
    Column(horizontalAlignment = Alignment.CenterHorizontally) {
        Text("当前计数: $count", style = MaterialTheme.typography.headlineMedium)
        Button(onClick = onIncrement) { Text("➕ 增加") }
        OutlinedButton(onClick = onReset) { Text("↺ 重置") }
    }
}

// 父组件 —— 持有状态,管理逻辑
@Composable
fun CounterScreen() {
    var count by remember { mutableStateOf(0) }

    CounterDisplay(
        count = count,
        onIncrement = { count++ },
        onReset = { count = 0 }
    )
}

✅ 状态 count 被提升到 CounterScreen,CounterDisplay 完全无状态,便于测试和复用。

📊 常见状态管理方式对比

方式作用域适用场景特点
remember当前 Composable简单局部状态随重组保留,配置变更丢失
rememberSaveable当前 Composable需要屏幕旋转保留通过 Bundle 保存
ViewModelActivity / Fragment复杂业务逻辑生命周期感知,配置变更保留
StateFlow跨层/跨组件异步数据流冷流,配合 collectAsState

📝 小结 · 状态管理三要素

  • 状态 是 UI 的“燃料”,驱动界面变化。
  • 管理 让状态可预测、可调试、可复用。
  • Compose 核心思想:状态提升 + 单向数据流 + 可观察状态 + 最小重组。