Compose 重组

文章目录

  • Compose 重组
    • 概述
    • 重组特性
      • 组件会按任意顺序运行
      • 组件并行运行
      • 重组更新部分组件
      • 重组是乐观操作
    • 重组作用域

Compose 重组

概述

组合阶段用于生成并维护 LayoutNode 视图树,当使用 Activity 中的 setContent() 时,会开始首次组合,这时执行的代码中的所有 Composable 函数体都会生成与之对应的 LayoutNode 视图树。同样,传统 View 体系也是在 setContentView() 中首次构建 View 视图树。

在 Compose 中如果 Composable 函数中依赖了可变状态,当该状态发生变更时,会触发当前 Composable 进行重组,在当前组件发生重组时,子Composable也会被依次重新调用:

  • 子 Composable 会将输入参数与重组前的参数做比较,如果参数变化,则 Composable 会进行重组,更新LayoutNode 视图树上对应节点,UI发生更新;如果参数无变化,则跳过本次执行,也就是智能重组,UI无变化。
  • 如果子 Composable 在重组中没有被再次调用,则对应的节点以及子节点会从 LayoutNode 视图树中被移除,UI从屏幕移除。

重组可以自动维护 LayoutNode 视图树,使其永远保持最新的视图状态。而传统的 View 体系,则只能对 ViewGroup 进行 add/remove 等操作维护View视图树,这是两种视图体系的区别。

重组特性

组件会按任意顺序运行

@Composable
fun Bottom() {MyList {MyOne()MyTwo()MyThree()}
}

组件 MyOne/MyTwo/MyThree 的执行顺序是任意,各组件之间是独立的。

在一个Box布局中处于前景的UI具有较高的优先级,因此Composable会根据优先级来执行,这与代码中出现的位置可能并不一致。

组件并行运行

重组中的Composable并不一定执行在UI线程,它们可能在后台线程池中并行执行,这有利于发挥多核处理器的性能优势。但是由于多个Composable在同一时间可能执行在不同线程,此时必须考虑线程安全问题。

@Composable
fun MyList(list: List<String>) {Row(horizontalArrangement = Arrangement.SpaceBetween) {Column {for (item in list) {Text("Item: ${item}")}}Text("Count: ${list.size}")}
}

错误:

@Composable
fun MyListWithBug(list: List<String>) {var count = 0Row(horizontalArrangement = Arrangement.SpaceBetween) {Column {for (item in list) {Text("Item: ${item}")count++}}Text("Count: ${count}")}
}

这是一个错误案例,每次重组时都会修改count值,同时count值不能准确显示。

重组更新部分组件

Compose 只重组需要更新的部分。

@Composable
fun NamePicker(header: String, names: List<String>, onNameClicked: (String) -> Unit) {Column {Text(header, style = MaterialTheme.typography.h5)Divider() // 分割线LazyColumn(modifier = Modifier.fillMaxSize()) {  // 类似于RecyclerView,后续章节会讲items(names) { name ->NamePickerItem(name, onNameClicked)}}}
}@Composable
private fun NamePickerItem(name: String, onClicked: (String) -> Unit) {Text(name, Modifier.clickable(onClick = { onClicked(name) }))
}

当header值发生变化时,Compose会进行重组,但是name值没有发生变化所以 NamePickerItem 组件和 Divider 组件不会被重组。

重组是乐观操作

所谓“乐观”是指Composable最终总会依据最新的状态正确地完成重组。在某些场景下,状态可能会连续变化,这可能会导致中间态的重组在执行中被打断,新的重组会插入进来。对于被打断的重组,Compose不会将执行一般的重组结果反应到视图树上,因为它知道最后一次状态总归是正确的,因此中间状态丢弃也没关系。

重组作用域

重组是智能的,会尽可能跳过不必要的重组。

@Composable
fun RecomposePage() {Log.e("TAG", "Scope-1 run")var counter by remember { mutableStateOf(0) }Column {Log.e("TAG", "Scope-2 run")Button(onClick = run {Log.e("TAG", "Button Scope")return@run {counter++}}) {Log.e("TAG", "Scope-4 run")Text("hello")}Text("$counter")}
}

点击按钮后输出:

Scope-1 run
Scope-2 run
Button Scope

经过Compose编译器处理后的Composable代码在对State进行读取的同时,能够自动建立关联,在运行过程中当State变化时,Compose会找到关联的代码块标记为Invalid。在下一渲染帧到来之前,Compose会触发重组并执行invalid代码块,Invalid代码块即下一次重组的范围。能够被标记为Invalid的代码必须是非inline且无返回值的Composable函数或lambda。

说明:Column 是一个 inline 声明的高阶函数,内部 content 也会被展开在调用处,Scope-2与Scope-1共享重组范围,因此“Scope-1 run”日志都会被输出。虽然Button没有依赖counter,但是Scope-2的重组会触发Button的重新调用,所以“Button-onclick”的日志也会输出。虽然Button会重新调用,但是其content内部并没有依赖counter,所以“Scope-3 run”也就不会输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/10473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序获取手机号,用户昵称,头像

一、手机号 在微信小程序中&#xff0c;获取用户手机号也需要用户的明确授权。你可以使用 button 组件的 open-type 属性设置为 getPhoneNumber 来实现这个功能。当用户点击这个按钮时&#xff0c;会弹出一个对话框请求用户的授权。如果用户同意&#xff0c;你可以在 bindgetp…

在学习uni-app过程中使用的css样式记录

在学习uni-app过程中&#xff0c;记录下使用的css样式&#xff0c;持续更新 <style lang"scss" scoped> // lang"scss":是定义样式的方式&#xff1b;scoped&#xff1a;只在当前页面生效的样式 width: 100vw; //设置宽&#xff0c;单位px、%、vw&…

通过三重循环遍历来寻找两个顶点之间的最短路径[示例]

弗洛伊德-沃舍尔算法&#xff08;Floyd-Warshall Algorithm&#xff09;是一种用于解决所有节点对之间最短路径的动态规划算法。它能够有效地计算出图中任意两个节点之间的最短路径长度。 这个算法的基本思想是通过逐步迭代来寻找两个顶点之间的最短路径。它的核心思想是利用中…

知识付费语音问答系统的商业模式,在线教育有哪些付费推广渠道?

在线教育越发火热&#xff0c;那么竞争也就越激烈。目前在线教育行业有一大痛点那就是难以获取用户&#xff0c;在这种情况下光靠免费渠道获取流量是远远不够的。那么在线教育付费推广方法有哪些? 1、SEM&#xff1a; SEM就是大家常说的竞价广告&#xff0c;包括百度竞价、360…

前端内嵌iframe网页单点登录的三种方式

背景&#xff1a;我们开发中会遇到让内嵌的iframe进行登录&#xff0c;但是有希望是单点登录&#xff0c;不想多次登录 目录 方法一&#xff1a;共享sessionStorage或localStorage 方法二&#xff1a;设置内嵌iframe的url参数 方法三&#xff1a;通过父子页面通信postMessage…

共赴科技盛会“2024南京智博会”11月在南京国际博览中心召开

2024年&#xff0c;南京这座历史悠久的文化名城迎来了一场科技与智慧交织的盛会——南京智博会|南京国际智慧城市、物联网、大数据。本次博览会以智慧城市、人工智能、消费电子、物联网、大数据为主题&#xff0c;汇聚了全球各地的智能科技精英&#xff0c;共同探讨智慧城市建设…

46 udp网络程序

查询网络服务的命令 netstat -nlup n: 显示数字 a&#xff1a;显示所有 u&#xff1a;udp服务 p&#xff1a;显示pid Recv-Q收到的数量&#xff0c;本地ip和远端ip&#xff0c;00表示可以收到任何地址 网络聊天 服务端 定义一个server类&#xff0c;成员保存ip地址&#xff…

龟兔赛跑(基于GUI与多线程实现)

直击龟兔赛跑现场 下面这张图是我们设计龟兔赛跑界面的初始效果与基本组成结构&#xff1a; 接下来是我仅代表我个人提出的一些疑问与解答&#xff1a; 1、俩动物以图片的形式显示&#xff1f; 其实在这里两个动物类就像标签一样 标签组件是什么&#xff1f;用于短文本字符串…

从loss角度理解LLM涌现能力

如今的很多研究都表明小模型也能出现涌现能力&#xff0c;本文的作者团队通过大量实验发现模型的涌现能力与模型大小、训练计算量无关&#xff0c;只与预训练loss相关。 作者团队惊奇地发现&#xff0c;不管任何下游任务&#xff0c;不管模型大小&#xff0c;模型出现涌现能力…

云贝教育 |【直播课】5月19日Oracle 19c OCM认证大师课 即将上课了!(附课件预览)

贝教育独家认证课OCM全网价格最低&#xff0c;性价比最高&#xff01;&#xff01;&#xff01; Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) OCM部分课件预览 Oracle Database 19c Certified Master Exam (OCM) 认证大师 25 天 / 150课时 什么是Oracle 1…

0X JavaSE-- UML、

# Unified Modeling Language UML 统一建模语言 UML 是一种图形化的语言。 UML 不是专门为 Java 准备的。 只要是面向对象的编程语言&#xff0c;开发前的设计&#xff0c;都需要画 UML 图进行系统设计。 最常用的四个 UML 图是 类图&#xff08;Class Diagram&#xff09;&…

启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS

ESP32-C3因为其性价比高&#xff0c;价格便宜性能又好一直是量产的首选芯片&#xff0c;随着量产项目扩大&#xff0c;对接云服务器的情况也增加了&#xff0c;接下来小启给大家分享下启明云端ESP32-C3模组——WT32C3系列模组/开发板连接AWS亚马逊云方法。 WT32C3系列模组 WT3…

笨方法自学python(一)

我觉得python和c语言有很多相似之处&#xff0c;如果有c语言基础的话学习python也不是很难。这一系列主要是学习例题来学习python&#xff1b;我用的python版本是3.12 代码编辑器我用的是notepad&#xff0c;运行py程序用cmd 现在开始写第一个程序&#xff1a; print ("…

ViLT 浅析

ViLT 浅析 论文链接&#xff1a;ViLT 文章目录 ViLT 浅析创新点网络结构总结 创新点 本文先分析了4种不同类型的Vision-and-Language Pretraining(VLP) 其中每个矩形的高表示相对计算量大小&#xff0c;VE、TE和MI分别是visual embedding、text embedding和modality interact…

Excel 根据分类及组内序号进行编码

例题描述和简单分析 Excel 记录课程数据&#xff0c;未排序&#xff0c;部分如下&#xff1a; ABC1CourseDateTime2Word1-Sep-209:003Word1-Sep-209:004PowerPoint1-Sep-209:005Word1-Sep-2012:006PowerPoint1-Sep-2012:007Excel1-Sep-2012:008Word1-Sep-2012:00 现在要新增…

【CAD建模号】学习笔记(四):工作平面

工作平面介绍 CAD建模号右侧导航栏提供了很多便捷的工具&#xff0c;有测量工具、坐标系、模型和图层切换、视图切换等。 1. 测量工具组 测量工具可以测量图形的几何体积&#xff0c;长度&#xff0c;角度等。工具组包含如下&#xff1a; 测量几何&#xff1a;可以测量图形的面…

笨方法自学python(二)-注释

注释和#号 程序里的注释是很重要的。它们可以用自然语言告诉你某段代码的功能是什么。在你想要临时移除一段代码时&#xff0c;你还可以用注解的方式将这段代码临时禁用。 # A comment, this is so you can read your program later. # Anything after the # is ignored by py…

【Python】IPython 魔法命令使用指南

依然记得从你口中 说出再见坚决如铁 昏暗中有种烈日灼身的错觉 黄昏的地平线 划出一句离别 爱情进入永夜 依然记得从你眼中 滑落的泪伤心欲绝 混乱中有种热泪烧伤的错觉 黄昏的地平线 割断幸福喜悦 相爱已经幻灭 &#x1f3b5; 周传雄《黄昏》 %run - 运行…

面向对象的三大特性:封装、继承、多态

一、封装 封装是面向对象的核心思想。是以类为载体&#xff0c;将对象的属性和行为封装起来&#xff0c;对外隐藏其实现细节。 封装保证了类内部数据结构的完整性&#xff0c;使得外部&#xff08;使用该类的用户&#xff09;不能轻易地直接操作此数据结构&#xff0c;只能执…

考了PMP后,NPDP到底还有没有必要考?NPDP通关宝典来啦!

NPDP和PMP相比&#xff0c;两者的相同点都是由美国发起的&#xff0c;都是管理行业的证书。区别也很大&#xff0c;PMP是项目经理国际认证证书&#xff0c;NPDP是产品经理认证证书&#xff0c;不过PMP已经由外专局引入国内二十多年了&#xff0c;在市面上知名度更高&#xff0c…