Compose 状态 / 协程 总图


Compose 状态 / 协程 总图(工程版)

复制代码
┌─────────────────────────────┐
│        User Interaction     │
│   click / scroll / input    │
└──────────────┬──────────────┘
               │
               ▼
┌─────────────────────────────┐
│        Composable(UI)       │
│─────────────────────────────│
│ 1️⃣ onClick / onEvent        │
│    └─ 调用 ViewModel 方法   │
│                              │
│ 2️⃣ collectAsStateWithLifecycle
│    └─ 订阅 State Flow       │
│                              │
│ 3️⃣ remember                │
│    └─ 本地 UI 状态          │
│                              │
│ 4️⃣ LaunchedEffect          │
│    └─ 收一次性事件          │
└──────────────┬──────────────┘
               │
               ▼
┌─────────────────────────────┐
│         ViewModel           │
│─────────────────────────────│
│ 5️⃣ 业务逻辑 / 决策          │
│                              │
│ 6️⃣ StateFlow<UiState>      │
│    └─ 持续状态(UI)        │
│                              │
│ 7️⃣ SharedFlow<Event>       │
│    └─ 一次性事件(导航等)  │
│                              │
│ 8️⃣ viewModelScope.launch   │
│    └─ 后台协程              │
└──────────────┬──────────────┘
               │
               ▼
┌─────────────────────────────┐
│     Coroutine / Data Layer  │
│─────────────────────────────│
│ 9️⃣ suspend / Flow           │
│    └─ IO / 网络 / 数据库    │
│                              │
│ 🔁 emit 新数据               │
└──────────────┬──────────────┘
               │
               ▼
┌─────────────────────────────┐
│      State 更新 → 重组      │
│─────────────────────────────│
│ State 改变                  │
│ → Composable 重组           │
│ → UI 更新                   │
└─────────────────────────────┘

用一句话读懂这张图

事件往下走,状态往上走

  • 👇 事件:UI → ViewModel → 协程
  • 👆 状态:数据 → StateFlow → UI

三条"生命线"(你一定要记)

① 状态线(State Line)

复制代码
Data → StateFlow → collectAsStateWithLifecycle → UI
  • 可以重放
  • 可以恢复
  • 驱动 UI

② 事件线(Event Line)

复制代码
ViewModel → SharedFlow → LaunchedEffect → UI
  • 只消费一次
  • 不能放 State
  • 导航 / Toast / Snackbar

③ 生命周期线(Lifecycle Line)

复制代码
Composable
   ├─ remember → 重组安全
   ├─ LaunchedEffect → 自动 cancel
   └─ collectAsStateWithLifecycle → STARTED 才收集

每个关键组件"该干嘛"

remember

解决重组问题

  • 本地 UI 状态
  • 不进 ViewModel

StateFlow

UI 的"唯一真相源"

  • 可恢复
  • 可重放

SharedFlow / Channel

一次性动作

  • 导航
  • 弹 Toast

LaunchedEffect

副作用容器

  • 协程入口
  • 绑定 Composable 生命周期

collectAsStateWithLifecycle

Flow → State 的桥

  • 自动感知生命周期
  • 官方推荐

常见错误 vs 正确流向(对照)

❌ 错误

复制代码
ViewModel 直接 navigate
Composable 存业务状态
State 控制导航

✅ 正确

复制代码
Composable 发事件
ViewModel 决策
UI 执行导航

一眼判断该不该用 remember / Effect

你想做的事 用什么
跨重组记住值 remember
启动协程 LaunchedEffect
UI 状态 StateFlow
一次性事件 SharedFlow
收 Flow 更新 UI collectAsStateWithLifecycle

最后一段(工程级总结)

Compose 是"状态驱动 UI 的协程系统"

你不是在写 View,

你是在搭一条:

复制代码
事件 ↓   状态 ↑

的单向数据流。


相关推荐
stevenzqzq3 天前
Android Navigation 组件页面跳转方法说明
android·compose
zh_xuan7 天前
Android compose 可见性动画未执行问题修复
android·compose
hnlgzb8 天前
请详细解释一下MVVM这个设计模型
android·kotlin·android jetpack·compose
hnlgzb10 天前
目前编写安卓app的话有哪几种设计模式?
android·设计模式·kotlin·android jetpack·compose
zh_xuan13 天前
Android compose Navigation 页面导航
android·compose
stevenzqzq16 天前
Kotlin 进阶指南:中缀函数 (Infix Function)
android·kotlin·compose
zh_xuan20 天前
Android compose 自定义主题
android·compose
zh_xuan20 天前
Android compose 使用viewModel
android·compose
stevenzqzq21 天前
MVI架构3--实战示例:我的收藏页面
设计规范·compose·mvi架构
zh_xuan21 天前
Android compose测试数据双向绑定
android·compose