资讯详情

【Jetpack Compose进阶学与练】第14课:系列收尾复习总结后续学习方向

📅 2026/10/10 16:26:59 | 华诺云谱 👁 阅读
【Jetpack Compose进阶学与练】第14课:系列收尾复习总结后续学习方向
前言本套教程从第1课从零搭建Compose开始依次学习基础布局、Modifier修饰器、状态与交互、 remember ‑ rememberSaveable 、副作用Effect、下拉弹窗、MVI架构、性能优化、Navigation导航、SavedStateHandle、项目分包模块化最后第13课完成简易笔记App实战。本节课整体复盘整套知识点梳理高频踩坑清单给出后续学习路线。知识点清单整套课程核心知识点复盘梳理Compose开发高频坑点汇总状态、重组、导航、生命周期、内存泄漏MVI架构开发的标准开发流程项目选型思考单Activity架构适用边界后续进阶学习路线动画、自定义Layout、图形绘制、跨端KMP整套课程知识复盘基础UI层第1‑4课Column、Row、Box三大基础布局Modifier修饰器控制尺寸、边距、背景Modifier执行顺序非常关键Modifier链式顺序会影响最终渲染效果。状态与交互第5‑8课状态提升原则TextField文本输入 remember 页面重组时保留状态 rememberSaveable 屏幕旋转重建保存简单状态副作用体系 LaunchedEffect 理解重组生命周期不要直接在Composable顶层写网络请求网络请求放到ViewModel。性能专题第9课重组Recomposition remember 缓存计算 derivedStateOf 派生状态过滤无效状态变更LazyColumn列表务必使用业务唯一id作为item的key禁止使用数组下标index优先使用不可变val数据类减少意外无效重组。导航与状态保存第10‑11课Navigation‑ComposeNavHost、NavController页面路径参数与查询参数popUpTo清理回退栈⚠️ NavController禁止保存进ViewModel会内存泄漏SavedStateHandle基于Bundle适合少量简单数据抗进程重启大数据业务持久化优先Room。工程架构第12‑13课单Activity架构分包 vs 模块化单向依赖原则MVI三要素Intent用户意图‑UiState常驻页面状态‑Effect一次性事件Toast、导航分层UI‑ViewModel‑Repository‑Data(Room/Retrofit)Room配合Flow实现响应式数据数据变更自动刷新UI实战简易笔记App完整跑通整套数据流。Compose高频坑点汇总状态相关坑使用普通 remember 屏幕旋转之后状态直接丢失少量状态改用 rememberSaveable 大量业务数据走Room。Effect一次性事件误用 StateFlow 页面重回之后重复消费旧事件一次性事件优先 SharedFlow 。重组性能坑LazyColumn不设置key增删列表数据之后出现item闪烁错乱。传入Composable可变集合(MutableList)修改集合内部元素Compose无法感知变更界面不会刷新必须使用不可变List配合State。高频变化原始状态直接驱动UI没有 derivedStateOf 过滤疯狂无效重组造成卡顿。导航与内存泄漏坑将 NavController 保存到ViewModelViewModel生命周期更长引发内存泄漏导航回调应该由UI层执行。popUpTo的 inclusive 取值错误登录跳转首页之后按返回键依然回到登录页面。架构分层坑在Compose页面直接发起网络请求、直接调用Dao数据库跳过ViewModel与Repository业务散落在UI组件后期维护困难。模块化的时候出现循环依赖common基础模块反向依赖上层业务模块。SavedStateHandle误区误以为SavedStateHandle可以存列表、Bitmap图片Bundle有容量上限只适合少量简单键‑值。MVI标准开发流程开发的时候可以照着这个流程写页面定义密封类 Intent列举本页面所有用户交互动作点击、下拉刷新、新增、删除定义密封类 UiState页面加载中 /成功(携带数据) /错误常驻渲染状态定义密封类 Effect一次性事件Toast、弹窗、页面跳转ViewModel接收Intent调用Repository访问数据源更新UiState发送EffectUI层collectAsStateWithLifecycle收集UiState渲染界面收集Effect处理一次性事件响应用户交互调用sendIntent发送意图。单Activity架构适用边界✅适合绝大多数业务AppCompose原生开发依靠Navigation‑Compose管理回退栈页面切换开销小统一页面转场动画。⚠️局限没有独立Activity销毁回收需要自己留意页面退出之后协程的取消部分特殊场景仍然保留多Activity第三方SDK登录页面、相机页面支付SDK页面。不必强行全部单Activity。后续进阶学习路线Compose动画Animatable、animate*AsState、Transition页面转场动画组件显隐动画实际项目UI非常看重动画效果。自定义布局与绘制Modifier.drawBehind、Layout自定义控件画布Canvas手写自定义图表。手势处理draggable、scroll拖拽手势、多点触控。Jetpack其余组件WorkManager后台任务权限请求Paging3分页加载LazyColumn分页是业务高频需求。KMP(Kotlin Multiplatform)一套Compose‑Multiplatform代码同时编译Android、桌面Windows/macOS、iOS可以往跨平台方向深入对比Tauri、Dioxus等Rust‑GUI。测试ViewModel单元测试Compose UI的instrumented界面测试。多元化习题练习习题1【基础‑改错题】开发写LazyColumn直接使用下标index当做item的key会出现什么问题答案当删除或者插入列表中间的数据数组下标发生变化Lazy复用视图的时候item内容错乱出现界面闪烁应该使用业务实体唯一id作为key。解读列表性能易错点实战务必留意。习题2【基础‑代码修改题】页面一次性toast提示事件现在已经定义好密封类ToastEffectViewModel内部如何发射该一次性事件答案_viewModelScope.launch{_effect.emit(ToastEffect(操作成功))}解读使用SharedFlow的emit不要使用StateFlow保存一次性消息。习题3【进阶‑补充代码题】简单描述 collectAsState() 和 collectAsStateWithLifecycle() 的区别。答案collectAsState页面后台不可见的时候仍然持续收集数据流会继续接收数据更新UI浪费资源collectAsStateWithLifecycle跟随页面生命周期页面进入后台暂停收集页面恢复之后继续收集正式项目优先使用collectAsStateWithLifecycle。解读生产环境尽量统一使用collectAsStateWithLifecycle。习题4【综合‑逻辑应用题】在MVI架构开发当中为什么用户操作不直接调用ViewModel里面零散的业务函数而是统一封装Intent调用sendIntent(intent)答案全部交互统一走Intent之后页面所有用户行为集中便于统一日志埋点方便单元测试后续新增交互只需要新增Intent密封子类架构风格统一。解读属于工程层面的约束小项目可以简化中大型业务App强烈建议坚持该写法。习题5【概念简答题】SavedStateHandle和Room持久化二者如何分工答案SavedStateHandle基于Bundle保存少量临时状态用于屏幕旋转、后台进程被杀重启恢复UI临时输入生命周期跟随页面回退栈卸载App之后数据消失。Room数据库真正本地持久化保存业务数据笔记、列表App重启、关机之后数据仍然保留大量业务数据优先使用Room。解读临时UI状态与业务持久化数据分开对待。本节课知识点总结复盘整套1‑13课完整知识点基础布局‑Modifier‑状态‑副作用‑性能‑导航‑SavedStateHandle‑架构MVI‑模块化分包‑笔记实战。梳理开发高频坑状态丢失、无效重组、列表闪烁、内存泄漏、SavedStateHandle误用。熟悉MVI标准开发流程后续写业务页面可以直接参考这套流程理解单Activity架构的优势与局限不必教条式全部页面强行单Activity特殊SDK页面保留独立Activity。指明后续进阶学习方向动画、自定义绘制手势、Paging3分页KMP跨平台单元与UI测试也可以横向对比其他GUI技术栈拓展视野。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑