type
status
date
slug
summary
tags
category
icon
password
日志总结
生命周期
Compose是一种声明式的UI,页面由可组合项构成。可组合项的生命周期包括:
进入组合→重组→退出组合。Compose编译器会确定每个可组合项的调用点,如果是组合中的可组合项,每一个可组合项都有一个调用点。如果组合项的状态改变,则其会进入重组,但是为了优化性能,会智能的重组其中最小的变化了的组合项,其余的保留原本状态不变。
关于这个最小的重组单元怎么界定,Compose中规定了一些(稳定)特性:不可变或者变化后会给Compose发送通知。并且还规定了一些稳定类型诸如MutableState等。在重组中,稳定的会根据值是否改变进行重组和跳过,但是不稳定的需要全部重新重组。(这是性能问题的来源)(当然也可以强制使用@Stable稳定,但不推荐除非真的稳定)
副作用
附带效应(副作用)是指因为不可预期(执行时机、次数和范围由框架智能决定,而非开发者逐行命令控制)的重组导致外界没有得到预期的内容,而这个不可预期正是因为智能重组导致的。
智能重组有利用降低无意义的资源开支,提高软件性能,但是基于类型稳定性的重组跳过机制使得整个软件的重组变得不可预期,从而导致可组合项中某些修改外界内容的函数少次或多次执行。
由于利大于弊,最后Compose提供使用效应api,将副作用封装绑定到可组合项的生命周期中,从而实现可预测可管理。
LaunchedEffect 在某个可组合项的作用域内运行挂起函数rememberCoroutineScope 获取组合感知作用域,便在可组合项外启动协程rememberUpdatedState 在效应中引用某个值,该效应在值改变时不应重启DisposableEffect 需要清理的效应SideEffect 将Compose状态发布为非Compose代码produceState 将非Compose状态转换为Compose状态derivedStateOf 将一个或多个状态对象转换为其他状态snapshotFlow 将Compose的State转换为Flow阶段
Compose帧有三个阶段:
组合 →布局 →绘制组合控制UI树结构,布局控制尺寸和位置,绘制控制像素到屏幕。如果状态发生变化,则可以需要重新进行某些或全部阶段。
如果只有状态变了,UI结构变了则下一帧重新进入组合阶段,没变则跳过组合阶段;如果只有位置或尺寸变了,则下一帧跳过组合阶段进入布局阶段,可以使用支持lambda的延迟布局优化测量阶段的计算;如果只有外观变了,则下一帧跳过前两个阶段,重新绘制。
管理状态
状态提升
将状态提升至需要他的最小共同祖先,以供需要的组合在想要访问时候都能轻松访问,同时避免不需要的组件访问状态。
状态生命周期
用于存储状态通常使用两种函数:
remember和rememberSaveable ,后者存储的更久,准确的说在活动重新创建后、进程终止后都还存在。- 作者:holmes
- 链接:http://jokersh.me/article/2db54800-66d1-80c8-862f-d270cb378aaa
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。


