【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技术栈拓展视野。

相关新闻

【Jetpack Compose进阶学与练】第11课:ViewModel保存状态

【Jetpack Compose进阶学与练】第11课:ViewModel保存状态

目录 一、前言二、知识点清单三、完整示例源码四、逐行解读五、容易踩坑六、多元化习题(练习)七、本节课知识点总结八、下一课预告— 一、前言 手机屏幕旋转、系统夜间模式切换,会重新创建 Activity。普通的 remember { mutableStateOf() …

2026/10/12 0:54:37 阅读更多 →
r-nacos内置MCP Server,存量HTTP接口零改造接入AI Agent

r-nacos内置MCP Server,存量HTTP接口零改造接入AI Agent

最近MCP协议在技术圈的热度快被聊烂了:同花顺在做行情数据的MCP接入,Playwright在做浏览器自动化的MCP控制,好几家中后台框架也在原生支持MCP。可这些例子落到我们自己业务系统上,就有点尴尬了——公司有几十个注册在Nacos上的普通…

2026/10/13 9:00:51 阅读更多 →
能量回馈式变流器负载试验装置:方案选型与调试实践

能量回馈式变流器负载试验装置:方案选型与调试实践

1. 方案定位:先搞清楚到底要测什么、省多少电干电力电子这一行的人,对“负载试验”这四个字应该都不陌生。一台变流器出厂前,不做满功率带载测试根本不敢交付——器件的热稳定性、控制参数是否收敛、保护逻辑是否可靠,这些问题只通…

2026/10/12 0:54:46 阅读更多 →

最新新闻

多智能体电梯群控:基于目的楼层预约与PPO的深度强化学习实现

多智能体电梯群控:基于目的楼层预约与PPO的深度强化学习实现

简介:本资源是一套面向计算机、人工智能、自动化等专业学生的毕业设计与课程设计实践项目,聚焦于多智能体协同下的电梯群控优化问题,采用深度强化学习实现目的楼层预约调度算法,解决传统电梯响应延迟高、能耗大、乘客等待时间长等…

2026/10/13 19:14:30 阅读更多 →
语义分割环境搭建:PyTorch CPU与GPU版本安装及验证全攻略

语义分割环境搭建:PyTorch CPU与GPU版本安装及验证全攻略

1. 系列前情回顾与本期核心目标语义分割学习系列写到第四篇,前面几篇我分别梳理了语义分割的基本概念、常见数据集的组织方式、以及几个主流分割模型的结构差异。按照正常的学习路线,理论铺垫到这一步,接下来就该动手了。动手的第一步就是装环…

2026/10/13 19:14:30 阅读更多 →
Spring Boot配置绑定实战:@ConfigurationProperties原理与避坑

Spring Boot配置绑定实战:@ConfigurationProperties原理与避坑

接触Spring Boot这些年,我做得最多的一个动作就是替同事定位“配置不生效”的诡异问题。排查到最后,十有八九都落在同一个注解上——ConfigurationProperties。它看起来只是给配置类加个前缀声明,实际牵扯到数据绑定、松散命名、第三方注册、…

2026/10/13 19:14:30 阅读更多 →
语义分割必备:PyTorch CPU/GPU版本安装全攻略

语义分割必备:PyTorch CPU/GPU版本安装全攻略

废话不多说,直接进入正题。这一篇是这个系列的第四篇,主题是很多人在语义分割学习中绕不过去的第一道坎——CPU和GPU版本的PyTorch及其环境安装。前几篇我们聊了语义分割的数据标注、模型结构、评价指标,但真正动手跑代码的时候,你…

2026/10/13 19:14:29 阅读更多 →
Java核心知识点全解析:从JVM到并发编程的底层原理

Java核心知识点全解析:从JVM到并发编程的底层原理

做Java开发这些年,我有一个很深的感受:真正拉开水平差距的,不是谁背的框架更多、API记得更熟,而是对底层那批核心知识点有没有吃透。所谓“Java重要知识点”,不是让你背八股文,而是帮你在遇到线上问题时&am…

2026/10/13 19:14:29 阅读更多 →
Go监听MySQL binlog实战:轻量级数据变更捕获与生产避坑指南

Go监听MySQL binlog实战:轻量级数据变更捕获与生产避坑指南

1. 这不是“监听MySQL”,而是重建一套轻量级数据变更管道很多人第一次看到“用Go监听binlog”这个说法,第一反应是:“MySQL自己不就有mysqlbinlog命令吗?再不济写个Python脚本调用一下不就完了?”——我试过&#xff0…

2026/10/13 19:13:29 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →