只有读取可变状态的作用域才会被重组

这句话的意思是只有读取 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 的值之后,只有读取 counterText 组件背景色发生变化,这充分的说明了只有这个 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 中的重组作用域和性能优化相关推荐

  1. 了解 Jetpack Compose 中的重组

    对事件变化的响应对于创建最佳用户界面很重要.在许多情况下,用户不会输入正确的内容,并且当用户更改首选项或位置时,UI 必须更改. 为了使用户界面保持最新,UI 框架 Jetpack Compose 提 ...

  2. Jetpack Compose 中的架构思想

    Jetpack Compose 中的架构总览 如果应用打算使用 Jetpack Compose 来开发,那么就可以跟以前的MVC.MVP.MVVM等乱七八糟的架构全部说拜拜,这些名词也将在Androi ...

  3. 详解Jetpack Compose中的Modifier修饰符

    前言 本文将会介绍Jetpack Compose中的Modifier.在谷歌官方文档中它的描述是这么一句话:Modifier元素是一个有序.不可变的集合,它可以往Jetpack Compose UI元 ...

  4. Jetpack Compose 中使用 Lottie 动画

    从事 Android 开发的 都知道 airbnb 的 Lottie 库,如今它也支持在 Jetpack Compose 中使用了. http://airbnb.io/lottie/#/android ...

  5. 42. Compose1.4 如何在Jetpack Compose中为文本应用描边效果(OpenAi翻译)

    探索Jetpack Compose中文本笔画效果的DrawStyle API Jetpack Compose最近为TextStyle增加了很多新的自定义选项,TextStyle.drawStyle就是 ...

  6. 在 Jetpack Compose 中安全地使用数据流

    /   今日科技快讯   / 11月17日下午,暴雪中国官方微博发布公告称,各位暴雪游戏的国服玩家,我们很遗憾地通知大家,随着我们与网之易公司现有授权协议的到期,自2023年1月24日0点起,所有&l ...

  7. Jetpack Compose中的Modifier

    Modifier的基本使用 Modifier修饰符是Jetpack Compose中用来修饰组件的,提供常用的属性,写布局时几乎所有Composable组件的大部分属性都可以用Modifier 来修饰 ...

  8. Jetpack Compose中的手势操作

    点击事件 监听点击事件非常简单,使用 clickable 和 combinedClickable 修饰符即可满足需求: @OptIn(ExperimentalFoundationApi::class) ...

  9. Jetpack Compose中的Accompanist

    accompanist是Jetpack Compose官方提供的一个辅助工具库,以提供那些在Jetpack Compose sdk中目前还没有的功能API. 权限 依赖配置: repositories ...

最新文章

  1. FAST:基于FPGA的SDN交换机开源项目
  2. Alpha冲刺Day2
  3. 看云原生实战就来这里,侬晓得伐?
  4. 二、window下django安装及第一个应用
  5. echarts如何获取后端的值_Echarts 获取后台数据 使用后台数据展示 柱形图
  6. 【Ubuntu】Linux必备软件之Samba
  7. 论文浅尝 | XQA:一个跨语言开放域问答数据集
  8. 数学思想 —— 推广和泛化
  9. 埃博拉疫情蔓延在进行中
  10. 最全的HTTP1.1状态码
  11. 《那些年啊,那些事——一个程序员的奋斗史》八
  12. 蔡学镛:架构师最重视的文档
  13. openrasp-iast 灰盒扫描工具
  14. Python实战:利用Uplift模型识别营销敏感用户提升市场策略(二)
  15. PHP字体间距设置,CSS如何设置文字间距?
  16. overflow的用法(auto)
  17. AGC 012 E Camel and Oases - 状压dp
  18. 双模sa_一文看懂华为 Mate 20 X 5G 版中的 “双模、SA 和 NSA”
  19. 盖塔机器人好_盖塔机器人的十大谜团
  20. SCI、EI、IEEE、ACM、CCF

热门文章

  1. python 之pymysql安装问题
  2. js--模拟京东详情页图片放大效果
  3. CSS盒模型宽度和高度的计算
  4. 阿雪的学习记录|刷视频记录
  5. 我的目标,我的梦想,我的坚持---给自己一个见证
  6. python一些小代码集
  7. API hook原理和实例快速入门(inline hook),以dll线程注入方式使用(win7-64bit)
  8. c语言输入输出语句题目,C语言题目解答8程序填空,不要改变与输入输出有关的语句输入一个 爱问知识人...
  9. 【每日一知】什么是内聚和耦合? (2021.02.02 )
  10. 【Visual C++】游戏开发笔记十八 游戏基础物理建模 一 匀速与加速运动