文章目录
- 第 1 章 UDF 在 Compose 中的落点
- 第 2 章 remember 与 rememberSaveable
- 第 3 章 状态提升
- 第 4 章 副作用 Effect
- 踩坑
- 第 5 章 derivedStateOf
- 第 6 章 ViewModel 与事件
- 第 7 章 治理清单
- 面试速查 · 追问链
- 追问链 #1:remember vs ViewModel? 🔥
- 追问链 #2:LaunchedEffect 何时重跑? 🔥
- 追问链 #3:状态提升好处? ⭐
- 追问链 #4:与 MVI reduce? 💡
- 完整链路一句通
- 相关推荐
第 1 章 UDF 在 Compose 中的落点
ViewModel StateFlow ──▶ collectAsStateWithLifecycle ──▶ Composable 只读 用户点击 ──▶ 回调 onXxx ──▶ ViewModel 更新状态与《MVVM 与单向数据流》同一契约;Compose 只是渲染层。
第 2 章 remember 与 rememberSaveable
@ComposablefunSearchField(){varquerybyremember{mutableStateOf("")}TextField(value=query,onValueChange={query=it})}remember:重组后保留,配置变更可能丢。rememberSaveable:经SavedStateRegistrysurvived 旋转(小数据)。
业务列表、订单态进ViewModel,不要全靠remember。
第 3 章 状态提升
@ComposablefunParent(){varcountbyremember{mutableIntStateOf(0)}Counter(count,onInc={count++})}@ComposablefunCounter(count:Int,onInc:()->Unit){Button(onClick=onInc){Text("$count")}}谁需要读/写状态,谁拥有mutableState;子组件无状态(stateless)更易测和复用。
第 4 章 副作用 Effect
| API | 用途 |
|---|---|
LaunchedEffect(key) | 协程:拉数、collect Flow |
DisposableEffect | 注册/注销监听 |
SideEffect | 每次成功重组后同步非 Compose 状态 |
LaunchedEffect(userId){viewModel.load(userId)}LaunchedEffect(Unit)只跑一次;key 变则取消重跑。
踩坑
- 无 key 的 LaunchedEffect 在重组时重复执行。
- 在 Composable 里直接
viewModelScope.launch。
第 5 章 derivedStateOf
vallistbyviewModel.items.collectAsStateWithLifecycle()valfilteredbyremember{derivedStateOf{list.filter{it.done}}}仅当list引用或内容触发快照变化时重算;避免每次重组全表 filter。
第 6 章 ViewModel 与事件
@ComposablefunTodoRoute(vm:TodoViewModel=hiltViewModel()){valstatebyvm.uiState.collectAsStateWithLifecycle()LaunchedEffect(Unit){vm.events.collect{/* 导航/Toast */}}TodoScreen(state,onRefresh=vm::onRefresh)}状态StateFlow;一次性事件SharedFlow/Channel(《MVVM 与单向数据流》)。
第 7 章 治理清单
| 检查项 | 通过标准 |
|---|---|
| 业务状态 | ViewModel StateFlow,非 remember 扛全局 |
| 收集 | collectAsStateWithLifecycle |
| 副作用 | LaunchedEffect/DisposableEffect,非裸 launch |
| 提升 | 子 Composable 无隐藏 mutableState |
| 性能 | 列表 key、derivedStateOf 减算力 |
面试速查 · 追问链
追问链 #1:remember vs ViewModel? 🔥
参考回答:UI 瞬态(展开/输入焦点)remember;业务数据 ViewModel+StateFlow。
追问链 #2:LaunchedEffect 何时重跑? 🔥
参考回答:key 变化或离开组合;Unit key 仅首次进入。
追问链 #3:状态提升好处? ⭐
参考回答:单一数据源、子组件可复用、便于单测。
追问链 #4:与 MVI reduce? 💡
参考回答:MVI 在 VM;Compose 只 collect State、发 Intent 回调。
完整链路一句通
remember 管 UI 局部态→业务态 stateIn/StateFlow→collectAsStateWithLifecycle→LaunchedEffect 管副作用→事件通道旁路导航。
相关推荐
Kotlin 作用域函数:let/apply 怎么选
Kotlin 语法与空安全:从零的第一课