Jetpack Compose 中的重组作用域和性能优化
只有读取可变状态的作用域才会被重组
这句话的意思是只有读取 mutableStateOf()
函数生成的状态值的那些 Composable
函数才会被重新执行。注意,这与 mutableStateOf()
函数在什么位置被定义没有关系。读取操作指的是对状态值的 get
操作。也就是取值的操作。
从一个最简单的例子开始:
@Composable
fun Sample() {Column(modifier = Modifier.padding(4.dp).shadow(1.dp, shape = CutCornerShape(topEnd = 8.dp)).background(getRandomColor()).padding(4.dp),horizontalAlignment = Alignment.CenterHorizontally) {var counter by remember { mutableStateOf(0) }Text("Text1", color = Color.White, modifier = Modifier.background(getRandomColor()))Button(modifier = Modifier.fillMaxWidth(),colors = ButtonDefaults.buttonColors(backgroundColor = getRandomColor()),onClick = { counter++ },shape = RoundedCornerShape(5.dp)) {Text("Text2: counter: $counter", color = Color.White, modifier = Modifier.background(getRandomColor())) }}
}
fun getRandomColor() = Color(red = Random.nextInt(256),green = Random.nextInt(256),blue = Random.nextInt(256),alpha = 255
)
在上面的代码中,我们为每个 Composable
组件都设置了一个随机的背景颜色,这样,一旦它们发生了重组,我们就可以观察到。
这里点击 Button
修改 counter
的值之后,只有读取 counter
的 Text
组件背景色发生变化,这充分的说明了只有这个 Text
组件才会重组。位于 Button
之上的 Text
组件,虽然它与 counter
定义在同一作用域范围内,但是它不会被触发重组,因为它没有读取该 counter
的值。
假如我们把 Button
内的组件换成一个自定义的 Composable
组件,只要它读取 counter
的值,那么该自定义组件的整个作用域范围都会执行重组:
@Composable
private fun Sample1() {Column(modifier = Modifier.padding(4.dp).shadow(1.dp, shape = CutCornerShape(topEnd = 8.dp)).background(getRandomColor()).padding(4.dp),horizontalAlignment = Alignment.CenterHorizontally) {var counter by remember { mutableStateOf(0) }Text("Text1", color = Color.White, modifier = Modifier.background(getRandomColor()))Button(modifier = Modifier.fillMaxWidth(),colors = ButtonDefaults.buttonColors(backgroundColor = getRandomColor()),onClick = { counter++ },shape = RoundedCornerShape(5.dp)) { MyText(counter)}}
}@Composable
fun MyText(counter: Int) {Column {Text("MyText: counter: $counter", color = Color.White, modifier = Modifier.background(getRandomColor()))Text("Another Text", color = Color.White, modifier = Modifier.background(getRandomColor()))}
}
可以看到,点击修改counter
值的时候,不仅 MyText
组件中的第一个读取 counter
值的 Text
组件会发生重组,而且 MyText
组件中的另一个未读取 counter
值的 Text
组件也发生了重组。也就是说整个 MyText
组件都发生了重组。
内联组件的重组作用域与其调用者相同
在一般情况下,读取某个state值的组件和未读取某个state值的组件,它们的重组作用域是隔离的,互不影响。但是内联组件除外。可以通过下面的例子来说明这个问题:
@Composable
fun Sample() {Column(modifier = Modifier.padding(4.dp).shadow(1.dp, shape = CutCornerShape(topEnd = 8.dp)).background(getRandomColor()).padding(4.dp)) {var update1 by remember { mutableStateOf(0) } println("ROOT")Text("Text in outer Column", color = Color.White, modifier = Modifier.background(getRandomColor()))Button(modifier = Modifier.fillMaxWidth(),colors = ButtonDefaults.buttonColors(backgroundColor = getRandomColor()),onClick = { update1++ },shape = RoundedCornerShape(5.dp)) {println("
Jetpack Compose 中的重组作用域和性能优化相关推荐
- 了解 Jetpack Compose 中的重组
对事件变化的响应对于创建最佳用户界面很重要.在许多情况下,用户不会输入正确的内容,并且当用户更改首选项或位置时,UI 必须更改. 为了使用户界面保持最新,UI 框架 Jetpack Compose 提 ...
- Jetpack Compose 中的架构思想
Jetpack Compose 中的架构总览 如果应用打算使用 Jetpack Compose 来开发,那么就可以跟以前的MVC.MVP.MVVM等乱七八糟的架构全部说拜拜,这些名词也将在Androi ...
- 详解Jetpack Compose中的Modifier修饰符
前言 本文将会介绍Jetpack Compose中的Modifier.在谷歌官方文档中它的描述是这么一句话:Modifier元素是一个有序.不可变的集合,它可以往Jetpack Compose UI元 ...
- Jetpack Compose 中使用 Lottie 动画
从事 Android 开发的 都知道 airbnb 的 Lottie 库,如今它也支持在 Jetpack Compose 中使用了. http://airbnb.io/lottie/#/android ...
- 42. Compose1.4 如何在Jetpack Compose中为文本应用描边效果(OpenAi翻译)
探索Jetpack Compose中文本笔画效果的DrawStyle API Jetpack Compose最近为TextStyle增加了很多新的自定义选项,TextStyle.drawStyle就是 ...
- 在 Jetpack Compose 中安全地使用数据流
/ 今日科技快讯 / 11月17日下午,暴雪中国官方微博发布公告称,各位暴雪游戏的国服玩家,我们很遗憾地通知大家,随着我们与网之易公司现有授权协议的到期,自2023年1月24日0点起,所有&l ...
- Jetpack Compose中的Modifier
Modifier的基本使用 Modifier修饰符是Jetpack Compose中用来修饰组件的,提供常用的属性,写布局时几乎所有Composable组件的大部分属性都可以用Modifier 来修饰 ...
- Jetpack Compose中的手势操作
点击事件 监听点击事件非常简单,使用 clickable 和 combinedClickable 修饰符即可满足需求: @OptIn(ExperimentalFoundationApi::class) ...
- Jetpack Compose中的Accompanist
accompanist是Jetpack Compose官方提供的一个辅助工具库,以提供那些在Jetpack Compose sdk中目前还没有的功能API. 权限 依赖配置: repositories ...
最新文章
- FAST:基于FPGA的SDN交换机开源项目
- Alpha冲刺Day2
- 看云原生实战就来这里,侬晓得伐?
- 二、window下django安装及第一个应用
- echarts如何获取后端的值_Echarts 获取后台数据 使用后台数据展示 柱形图
- 【Ubuntu】Linux必备软件之Samba
- 论文浅尝 | XQA:一个跨语言开放域问答数据集
- 数学思想 —— 推广和泛化
- 埃博拉疫情蔓延在进行中
- 最全的HTTP1.1状态码
- 《那些年啊,那些事——一个程序员的奋斗史》八
- 蔡学镛:架构师最重视的文档
- openrasp-iast 灰盒扫描工具
- Python实战:利用Uplift模型识别营销敏感用户提升市场策略(二)
- PHP字体间距设置,CSS如何设置文字间距?
- overflow的用法(auto)
- AGC 012 E Camel and Oases - 状压dp
- 双模sa_一文看懂华为 Mate 20 X 5G 版中的 “双模、SA 和 NSA”
- 盖塔机器人好_盖塔机器人的十大谜团
- SCI、EI、IEEE、ACM、CCF
热门文章
- python 之pymysql安装问题
- js--模拟京东详情页图片放大效果
- CSS盒模型宽度和高度的计算
- 阿雪的学习记录|刷视频记录
- 我的目标,我的梦想,我的坚持---给自己一个见证
- python一些小代码集
- API hook原理和实例快速入门(inline hook),以dll线程注入方式使用(win7-64bit)
- c语言输入输出语句题目,C语言题目解答8程序填空,不要改变与输入输出有关的语句输入一个 爱问知识人...
- 【每日一知】什么是内聚和耦合? (2021.02.02 )
- 【Visual C++】游戏开发笔记十八 游戏基础物理建模 一 匀速与加速运动