Android Jetpack Compose基础之State状态

Android Jetpack Compose基础之State状态

    • Stateless和Stateful
      • 什么是Stateless,让我看下面代码
      • Stateless它有什么特点呢
      • Stateless它是如何实现避免无效重组的呢
      • 什么是Stateful,让我看下面代码
    • Compose中的State<T>
      • State子类之MutableState
    • 状态的恢复与持久化
      • remember
      • rememberSaveable
      • 其它方式:

Stateless和Stateful

什么是Stateless,让我看下面代码

@Composable
fun Greeting(name:String){Text(text = "Hello $name")
}

Greeting方法中未持有或访问了某些状态,它唯一变化的来自参数,所以他就是一个无状态的纯函数;

Stateless它有什么特点呢

1、当无状态函数的参数没有发生改变时,不会参与调用方的重组,将重组范围局限在无状态函数外部;

Stateless它是如何实现避免无效重组的呢

Compose编译器在@Composable注解的函数体内进行了字节码插桩技术,在Text调用之前对参数进行了判断,如果参数没有变化,则跳过对Text的调用,从而避免无效重组。

什么是Stateful,让我看下面代码

@Composable
fun GreetingStateful(){var name by remember{mutableStateOf("World")}Text(text = "Stateful")Text(text = "Hello $name", modifier = Modifier.clickable {name ="World ${Random.nextInt(100)}"})
}

在代码内部我们创建了状态name来记录最新的值,GreetingStateful中依赖对name的读写,因此它时一个Stateful。

Compose中的State

在Compose中使用State描述一个状态,当Composable对state的值进行读取的同时会与state建立订阅关系,当值发生改变时,Composable会自动重组刷新ui

@Stable
interface State<out T> {val value: T//不可修改
}

State子类之MutableState

如果需要对Sate的value进行修改,则需要使用MutableState来表示可修改状态

@Stable
interface MutableState<T> : State<T> {override var value: T //var可修改类型operator fun component1(): Toperator fun component2(): (T) -> Unit
}

创建方式1:直接赋值

    val name = mutableStateOf("default")

创建方式2:解构

	val(name2,setName2) = mutableStateOf("default")

创建方式3:属性代理

	var name3 by mutableStateOf("default")

状态的恢复与持久化

remember

1、未避免因重组导致状态的丢失,我们常见的是使用remember实现缓存状态

    var name4 by remember {mutableStateOf("default")}

rememberSaveable

2、虽然remember能跨越重组,但是不能跨越Acitivity和进程,这时我们需要使用rememberSaveable

    var name5 by rememberSaveable {mutableStateOf("default")}

rememberSaveable 中的数据会在onSaveInstanceState中以Bundle形式进行保存,在进程或者activity重建时根据key恢复到对应的Composable中,这个key是Compsable在编译期被确定的唯一表述,其源码如下

@Composable
fun <T : Any> rememberSaveable(vararg inputs: Any?,saver: Saver<T, out Any> = autoSaver(),key: String? = null,init: () -> T
): T {val compositeKey = currentCompositeKeyHash// key is the one provided by the user or the one generated by the compose runtimeval finalKey = if (!key.isNullOrEmpty()) {key} else {compositeKey.toString(MaxSupportedRadix)}@Suppress("UNCHECKED_CAST")(saver as Saver<T, Any>)val registry = LocalSaveableStateRegistry.currentval holder = remember {// value is restored using the registry or created via [init] lambdaval restored = registry?.consumeRestored(finalKey)?.let {saver.restore(it)}val finalValue = restored ?: init()SaveableHolder(saver, registry, finalKey, finalValue, inputs)}val value = holder.getValueIfInputsDidntChange(inputs) ?: init()SideEffect {holder.update(saver, registry, finalKey, value, inputs)}return value
}

其它方式:

如ViewModel等等方式,不再赘述

——note end——
原理有待探索~~

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

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

相关文章

SQL 中: 索引的建立和删除

目录 实验过程创建索引修改索引删除索引查询索引查看索引信息分析索引待续、更新中 实验过程 1 在STUDENT表的sno列上创建一个非聚簇索引&#xff0c;索引名为“student_sno_idx”。 CREATE INDEX student_sno_idx ON STUDENT (sno);2.在STUDENT表上按sno的升序&#xff0c;…

2024-简单点-深度学习下的边缘检测资料

1 OpenCV4 调用HED边缘检测算法 CVPR 2022&#xff0c;边缘检测 EDTER: Edge Detection with Transformer DexiNed

【Java】:按位与、按位或

按位与运算符&#xff08; & &#xff09; 当且仅当两个操作数的二进制的某一位均非0时&#xff0c;该位的结果才为1。 int a 5; int b 3; int c a & b; //c 1// 0 1 0 1 a 5 // 0 0 1 1 b 3 // 0 0 0 1 c 1按位或操作符&#xff08; | &#xff09;&#xff…

【脚本玩漆黑的魅影】全自动对战宫殿

文章目录 原理主要代码全部代码 原理 对战宫殿是让宠物自己打&#xff0c;不需要我们选技能&#xff0c;所以用来刷对战点数很合适。 需要准备三个主力。 主要是根据屏幕截图进行各种操作。 1&#xff0c;外面的对话&#xff0c;除了选自由级以外&#xff0c;其他都是直接点…

Exception异常处理

1. 两种异常处理机制 1.1 使用 throw 关键字手动抛出异常 使用throw关键字抛出异常&#xff0c;代码会的显得简单明了 如下图所示 1.2 使用 try-catch 捕获异常 使用try-catch进行捕获异常&#xff0c;往往会使代码变得更加笼统&#xff0c;层层包裹 如下图所示 2. 自定义…

无限连接的未来:Wi-Fi技术的演进、奥秘与前沿探索

Wi-Fi的历史与发展 Wi-Fi&#xff0c;全称是“Wireless Fidelity”&#xff0c;中文通常翻译为“无线保真”。它是一种允许电子设备通过无线网络连接到互联网的技术。Wi-Fi技术最早由Wi-Fi联盟&#xff08;原IEEE 802.11标准工作组&#xff09;在1997年提出&#xff0c;目的是…

SystemUI 解析

首语 SystemUI(System User Interface)是Android 系统为用户提供的系统级别的信息显示与交互的UI组件应用程序&#xff0c;包含状态栏、导航栏、锁屏、通知面板、快速设置、最近任务等&#xff0c;它们各部分独立&#xff0c;各尽其责。 SystemUI是一个常驻应用程序&#xff…

mybatisplus的条件构造器

条件构造器wrapper&#xff0c;主要用于构造sql语句的where条件&#xff0c;他更擅长这个&#xff0c;但也可以用于构造其他类型的条件&#xff0c;比如order by、group by等。 条件构造器的使用经验&#xff1a; 基于QueryWrapper的查询 练习1. void testQueryWrapper(){Q…

吴恩达机器学习笔记 十八 制定一个性能评估标准 学习曲线 高偏差 高方差

一个模型的好坏的评估基准可以从下面几个方面考虑&#xff1a; 1.考虑人类在这个问题上的表现 2.对比竞争算法的表现 3.根据经验猜测 判断是高偏差还是高方差 训练样本数量越多&#xff0c;越难完美地拟合每个样本&#xff0c;因此 J_train 会逐渐增大一点点&#xff0c;但泛…

线性代数笔记17--行列式及其性质

1. 行列式 符号标识 d e t A ∣ A ∣ det A |A| detA∣A∣ 1.1 基本性质 性质 1 1 1 单位矩阵的行列式为1&#xff1a; d e t I 1 det\ I1 det I1性质 2 2 2 行列式两行交换&#xff0c;行列式取反。 A ⟶ s w a p r o w i , r o w j A ′ d e t A ′ − d e t A A\st…

Rust常用特型之Drop特型

Rust常用特型之Drop特型.md在Rust标准库中&#xff0c;存在很多常用的工具类特型&#xff0c;它们能帮助我们写出更具有Rust风格的代码。 今天&#xff0c;我们主要学习Drop特型。 &#xff08;注&#xff1a;本文更多的是对《Programing Rust 2nd Edition》的自己翻译和理解&…

应届生求职面试注意事项

应届生求职面试注意事项 引言 对于即将毕业的应届生来说&#xff0c;进入职场是一个全新的挑战。在面对众多竞争者的情况下&#xff0c;成功通过面试是获得理想工作的关键一步。本文将介绍一些应届生求职面试的注意事项&#xff0c;帮助应届生更好地应对面试&#xff0c;提高…

算法——滑动窗口之找到字符串中所有的字母异位词,串联所有单词的子串

6.找到字符串中所有的字母异位词 题目:. - 力扣&#xff08;LeetCode&#xff09; 6.1如何快速判断两个字符串是否是异位词 假设现在有s1 aabca,s2 abaca,那么这两个就是异位词,容易想到的判断方法就是将两个字符串按照字典序排序,再依次比较,但是时间复杂度很高;我们看看…

乌干达公司注册优势 乌干达公司注册的条件 乌干达公司注册的流程

乌干达公司注册优势 1、乌干达拥有稳定的政 治环境和开 放的市场经济&#xff0c;为企业提供了良好的发展机遇。 2、乌干达有着优越的地理位置&#xff0c;位于东非内陆&#xff0c;毗邻肯尼亚、坦桑尼亚和刚果&#xff08;金&#xff09;&#xff0c;是通往东非和中非的理想…

精通MySQL:从下载到部署,一切尽在掌握

MySQL数据库下载及安装教程 MySQL是一款广泛应用于各类项目的开源关系型数据库管理系统。它基于Structured Query Language&#xff08;SQL&#xff09;进行数据操作&#xff0c;具有高性能、易使用、成本低等优点。在这篇文章中&#xff0c;我们将向你介绍如何在不同操作系统…

代码随想录算法训练营第五十天| 583. 两个字符串的删除操作 、72. 编辑距离

文章目录 1.两个字符串的删除操作2.编辑距离 1.两个字符串的删除操作 给定两个单词 word1 和 word2&#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步可以删除任意一个字符串中的一个字符。 示例 1&#xff1a; 输入: word1 “sea”, word2 “eat” 输出: 2 …

分享软件项目实施方案模板

本项目在实施过程中将遵守做到以下几个方面&#xff1a; 与建设单位共同完成整个系统软件、网络等设计,负责系统的开发、测试、调试、人员培训、系统的试运行和交付&#xff0c;并保证系统质量。负责系统的维护、应用软件的升级和更新。提出对系统硬件设备的相关技术要求。在项…

vue3 动态路由及使用动态路由后刷新界面出现空白页或者404

最近编写vue3动态路由的功能遇到了一些问题&#xff0c;处理好了&#xff0c;总结出来&#xff0c;希望能帮助到你。正片开始 先写好本地缓存菜单的方法&#xff08;存储、删除、获取&#xff09; // utils/menu.jsconst getMenuList () > {return JSON.parse(localStorag…

MachineSink - 优化阅读笔记

注&#xff1a;该优化与全局子表达式消除刚好是相反的过程&#xff0c;具体该不该做这个优化得看代价模型算出来的结果(有采样文件指导算得会更准确) 该优化过程将指令移动到后继基本块中&#xff0c;以便它们不会在不需要其结果的路径上执行。 该优化过程并非旨在替代或完全…

【大厂AI课学习笔记NO.80】深度学习行业人才能力图谱

深度学习领域的就业岗位及所需关键技术、工具、能力分析 深度学习作为人工智能领域的一个重要分支&#xff0c;近年来得到了飞速的发展。随着技术的不断进步和应用场景的不断拓展&#xff0c;深度学习领域的就业岗位也日益增多。本文将从领军人才、产业研发人才、应用开发人才…