news 2026/8/29 6:48:56

【Android】【Compose】Compose知识点复习(二)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Android】【Compose】Compose知识点复习(二)
可观察状态
状态类型与核心特点对照表
状态类型核心特点典型场景
mutableStateOf基础单值可观察状态,修改value触发重组计数器、开关、输入框文本、按钮状态
mutableStateListOf列表元素变化触发重组购物车、待办清单、动态列表
mutableStateMapOfMap 键值对变化触发重组用户配置、筛选条件、键值对数据
StateFlow + collectAsState跨组件共享状态,支持异步页面级共享状态、异步数据更新
derivedStateOf派生计算,仅结果变化触发重组(性能优化)滚动阈值、多状态组合计算
Flow + collectAsState普通 Flow 转可观察状态单次异步请求(网络/数据库)
remember ()

remember() 是 Compose 的 “状态存储器”,作用是在组件重组时保留状态值,避免每次重组都重新创建状态(比如mutableStateOf)。

通俗理解

把 Compose 重组比作 “教室换座位”:

没有remember():每次换座位,你都把笔记本扔了,重新拿个新本(mutableStateOf(0)重新创建,值重置为 0);

有remember():换座位时把笔记本装在书包里带走(状态被保留,值不会重置);

注意:remember() 只在 “同一重组作用域” 内有效 —— 如果组件被销毁重建(比如页面跳转后返回),状态还是会丢失(此时需要用rememberSaveable,但核心是remember的 “记忆” 特性)。

踩坑提醒:一定要加 remember!

如果忘记加remember(),会出现 “点击加 1 后,一重组就变回 0” 的诡异问题:

@ComposablefunRememberPitfallDemo(){// 错误:无remember,每次重组都重置为0val noRememberState=mutableStateOf(0)// 正确:有remember,重组时保留值val rememberState=remember{mutableStateOf(0)}Column{Text("无remember:${noRememberState.value}")// 永远是0(重组就重置)Text("有remember:${rememberState.value}")// 保留当前值Button(onClick={noRememberState.value++rememberState.value++}){Text("点击加1")}}}

日常开发中,remember和mutableStateOf几乎是 “绑定使用” 的:

// 标准写法:创建可观察状态并保留varcount by remember{mutableStateOf(0)}
= vs by
写法变量类型读取方式修改方式本质适用场景
val state = remember { mutableStateOf(0) }MutableState<Int>(容器)state.valuestate.value++直接持有状态容器本身需要操作容器(传递/比较)
var count by remember { mutableStateOf(0) }Int(容器内的值)countcount++通过委托访问容器内的值简化语法,直接操作值
通俗理解

把MutableState比作 “带盖子的盒子”:

= 写法:你直接拿到了 “整个盒子”,要拿 / 放里面的东西,必须先打开盖子(.value);

by 写法:你委托别人帮你管盒子,不用碰盒子本身,直接拿 / 放里面的东西(编译器自动开盖子)。

by 是 Kotlin 的委托语法糖,Compose 给MutableState实现了ReadWriteProperty接口,编译器会自动帮你补全.value:

// by 写法的等价代码(编译器自动生成)val countDelegate=remember{mutableStateOf(0)}varcount:Intget()=countDelegate.value// 读取时自动加.valueset(value){countDelegate.value=value}// 修改时自动加.value
注意点

by 写法必须用var(因为要修改值),用val会编译报错;

= 写法建议用val(容器本身不用重新赋值,只改内部.value);

两种写法的重组效果完全一致,没有性能差异,仅语法不同。

无状态 + 状态提升 + 单向数据流
概念核心定义
无状态组件组件内部不持有状态,所有状态由外部传入,仅负责“展示 UI”和“转发事件”
状态提升将组件的内部状态“提到”父组件管理,子组件通过参数接收状态和回调函数
单向数据流状态只能“从父到子”传递(读),修改需通过子组件调用父组件回调(写),形成闭环
通俗理解:用 “餐厅点餐” 类比

无状态组件 = 服务员:不记顾客点了什么(不持有状态),只负责把点餐需求传给前台(父组件),把菜品端给顾客(展示 UI);

状态提升 = 点餐状态交给前台:服务员(子组件)不存菜单,所有点餐信息集中在前台(父组件),避免多个服务员记的菜单不一致;

单向数据流 = 点餐流程:顾客→服务员→前台→后厨(状态传递:父→子),后厨做好菜→前台→服务员→顾客(事件回调:子→父),全程单向,不混乱。

反例 vs 正确示例
反例(有状态组件,不推荐)

子组件自己持有状态,父组件无法控制,复用性差:

// 有状态子组件:内部持有count,父组件无法获取/修改@ComposablefunBadCounter(){varcount by remember{mutableStateOf(0)}Button(onClick={count++}){Text("计数:$count")}}
正确示例(无状态 + 状态提升 + 单向数据流)
// 1. 无状态子组件:只接收状态和回调,不持有状态@ComposablefunGoodCounter(count:Int,// 从父组件接收状态(读)onCountAdd:()->Unit// 从父组件接收回调(写)){Button(onClick=onCountAdd){Text("计数:$count")}}// 2. 父组件:管理状态,实现单向数据流@ComposablefunCounterParent(){varcount by remember{mutableStateOf(0)}// 父组件持有状态Column{// 状态从父到子(读),修改通过回调(写)→ 单向数据流GoodCounter(count=count,onCountAdd={count++})Text("父组件同步显示:$count")// 父组件可复用状态,灵活扩展}}
核心优势

无状态组件:可复用性强(同一个组件传入不同状态就能展示不同内容)、易测试(传固定状态即可验证 UI);

状态提升:状态集中管理,避免多个组件持有同一份状态导致数据不一致;

单向数据流:状态变化可追踪,所有修改都通过回调函数,调试时能快速找到 “谁改了状态”。

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

虫害预警怎样更及时?虫情测报仪夜间自动诱捕拍照,助力植保提前规划

虫害的发生往往具有隐蔽性和突发性&#xff0c;等到田间出现明显为害症状时再防治&#xff0c;有时可能已造成一定影响。如何更早地发现害虫出现迹象&#xff0c;实现植保工作的提前部署&#xff0c;是种植管理中希望改善的环节。虫情测报仪在害虫监测预警方面提供了一种技术手…

作者头像 李华
网站建设 2026/8/28 16:45:53

UML和模式应用:类图建模详解

UML用类图&#xff08;class diagram&#xff09;表示类、接口及其关联。类图用于静态对象建模。 一、概述 类图(class diagram)展现了一组对象、接口、协作和它们之间的关系。在面向对象系统的建模中所建立的最常见的图就是类图。类图给出系统的静态设计视图。包含主动类的类…

作者头像 李华
网站建设 2026/8/27 2:50:39

超声测量距离模块RCWL-1640的评估

目的&#xff1a;学习超声测量距离模块RCWL-1640的使用&#xff0c;对其测量精度进行评估。准备工作&#xff1a;一。1个RCWL-1640模块&#xff0c;模块使用的芯片是RCWL-9610&#xff0c; 外围电路非常简单&#xff0c;只需要设置工作模式即可。二。1个USB TO TTL模块&#xf…

作者头像 李华
网站建设 2026/8/28 19:03:21

锂金属电池锂枝晶沉积溶解过程的三维电化学变形模型研究

锂金属电池锂枝晶溶解—沉积过程的三维变形模型模型为电化学模型&#xff0c;仿真锂金属电池在充放电过程中负极的锂枝晶沉积和溶解行为&#xff0c;可以计算生成锂枝晶浓度&#xff0c;因沉积变形而产生的应力应变和和变形情况等锂金属电池因其高比能和能量密度&#xff0c;被…

作者头像 李华
网站建设 2026/8/28 13:37:09

Java是否会被Python取代

引言&#xff1a;当 Python 狂飙突进&#xff0c;Java 真的面临替代危机吗&#xff1f;技术圈从不缺 “语言替代” 的争议&#xff0c;而近几年最火热的话题&#xff0c;莫过于 “Python 是否会取代 Java”。一边是 Python 的势如破竹&#xff1a;TIOBE 指数显示其近 5 年增速高…

作者头像 李华
网站建设 2026/8/28 16:16:30

Linly-Talker能否颠覆Synthesia?开源数字人实战解析

Linly-Talker能否颠覆Synthesia&#xff1f;开源数字人实战解析 在企业培训视频动辄花费数万元制作的今天&#xff0c;你有没有想过&#xff1a;一段专业级讲解视频&#xff0c;其实只需要一张照片、一段文字和一台消费级显卡就能生成&#xff1f; 这不是未来构想&#xff0c;而…

作者头像 李华