news 2026/7/24 18:05:52

Compose 状态、副作用与状态提升

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Compose 状态、副作用与状态提升

文章目录

  • 第 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/StateFlowcollectAsStateWithLifecycleLaunchedEffect 管副作用事件通道旁路导航


相关推荐

  • Kotlin 作用域函数:let/apply 怎么选

  • Kotlin 语法与空安全:从零的第一课

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 18:05:46

医疗大模型单卡部署:QLoRA与GPTQ量化实战

1. 项目背景与核心价值去年底MedicalGPT的论文刚发布时,我就被它的临床对话能力惊艳到了。这个专门针对医疗场景优化的语言模型,在问诊对话、病历生成和医学知识问答上的表现,明显优于通用大模型。但官方要求8张A100的配置让很多研究者望而却…

作者头像 李华
网站建设 2026/7/24 18:05:13

C++面向对象设计实践:构建可扩展修真游戏引擎框架

1. 项目概述:从“炼丹炉”到“修真世界4.0”几年前,我还在用C写一些控制台小游戏,比如猜数字、贪吃蛇,总觉得少了点意思。后来接触到一些修仙小说,里面宏大的世界观、复杂的境界体系和各种法宝功法,让我萌生…

作者头像 李华
网站建设 2026/7/24 18:04:36

最短路径在真实路网中的应用:道路权重、实时路况与动态规划

最短路径在真实路网中的应用:道路权重、实时路况与动态规划 一、深度引言与场景痛点:导航为什么会把你带到拥堵路段? 使用导航软件时,偶尔会遇到这样的场景:导航推荐了一条"最短路径"——公里数确实最短&…

作者头像 李华
网站建设 2026/7/24 18:03:49

GitHub中文插件:3步轻松实现全界面中文化,告别英文困扰

GitHub中文插件:3步轻松实现全界面中文化,告别英文困扰 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 你是否…

作者头像 李华
网站建设 2026/7/24 18:03:13

AzurLaneAutoScript:碧蓝航线自动化脚本的终极指南

AzurLaneAutoScript:碧蓝航线自动化脚本的终极指南 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 想要从碧蓝航…

作者头像 李华