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,

你是在搭一条:

复制代码
事件 ↓   状态 ↑

的单向数据流。


相关推荐
le16161611 天前
Android Compose——尺寸修饰符的调用顺序构成的不同尺寸约束效果
android·compose·modifier
le16161612 天前
Android Compose Modifier修饰符
android·compose·modifier
小书房12 天前
Android UI为什么由XML转向Compose
xml·ui·compose·声明式ui
le16161613 天前
Android Compose基础布局——从传统XML的视角切入了解
xml·compose
赏金术士18 天前
企业级 Jetpack Compose 项目(入门版)最佳结构
android·kotlin·compose
Jomurphys19 天前
Compose 调用 - 液态玻璃 Backdrop
android·compose
氦客22 天前
Android Compose 图层的合成 : BlendMode
android·compose·jetpack·layer·blendmode·graphics·图层的合成
赏金术士23 天前
第六章:UI组件与Material3主题
android·ui·kotlin·compose
赏金术士23 天前
Jetpack Compose 底部导航实战教程(完整版)
android·kotlin·compose
程序员煊子23 天前
用 Cursor 从零搭一个 Compose 本地记账 App:实战记录与源码解析
android·kotlin·compose·cursor