关键词

  1. 附带效应是指在可组合函数范围之外发生的应用状态变化
  2. 效应是一种可组合函数,该函数不会发出界面,并且在组合完成后产生附带效应。
效应名称 作用 用例
LaunchedEffect 在某个可组合项的作用域内运行挂起函数 snackBar显示
rememberCoroutineScope 获取组合感知作用域,以便在可组合项外启动协程 snackBar显示
rememberUpdatedState 在效应中引用某个值,该效应在值改变时不应重启 如果在 LaunchedEffect 运行时 onRefreshPosts 或 onErrorDismiss 发生变化, 请不要重新启动效果并使用最新的 lambda 值
DisposableEffect 需要清理的效应 -
SideEffect 将 Compose 状态发布为非 Compose 代码 FirebaseAnalytics 改变用户类型,转换为普通对象
produceState 将非 Compose 状态转换为 Compose 状态 -
derivedStateOf 将一个或多个状态对象转换为其他状态 -
snapshotFlow 将 Compose 的 State 转换为 Flow -

解释:不会发出界面指的是不会生成界面元素,可组合函数是被添加@Compose注解的函数

derivedStateOf:将一个或多个状态对象转换为其他状态,状态由其他状态转换而来。对于简单状态不需要转换的可以直接remember函数

如果某个状态是从其他状态对象计算或派生得出的,请使用 derivedStateOf。使用此函数可确保仅当计算中使用的状态之一发生变化时才会进行计算。

以下示例展示了基本的“待办事项”列表,其中具有用户定义的高优先级关键字的任务将首先显示:

@Composable
fun TodoList(highPriorityKeywords: List<String> = listOf("Review", "Unblock", "Compose")) {val todoTasks = remember { mutableStateListOf<String>() }// Calculate high priority tasks only when the todoTasks or highPriorityKeywords// change, not on every recompositionval highPriorityTasks by remember(highPriorityKeywords) {derivedStateOf { todoTasks.filter { it.containsWord(highPriorityKeywords) } }}Box(Modifier.fillMaxSize()) {LazyColumn {items(highPriorityTasks) { /* ... */ }items(todoTasks) { /* ... */ }}/* Rest of the UI where users can add elements to the list */}
}

在以上代码中,derivedStateOf 保证每当 todoTasks 发生变化时,系统都会执行 highPriorityTasks 计算,并相应地更新界面。如果 highPriorityKeywords 发生变化,系统将执行 remember 代码块,并且会创建新的派生状态对象并记住该对象,以代替旧的对象。由于执行过滤以计算 highPriorityTasks 的成本很高,因此应仅在任何列表发生更改时才执行,而不是在每次重组时都执行。

此外,更新 derivedStateOf 生成的状态不会导致可组合项在声明它的位置重组,Compose 仅会对返回状态为已读的可组合项(在本例中,指 LazyColumn 中的可组合项)进行重组。

该代码还假设 highPriorityKeywords 的变化频率显著低于 todoTasks。否则,该代码会使用 remember(todoTasks, highPriorityKeywords) 而不是 derivedStateOf。

Compose 中的附带效应

Compose 中的附带效应相关推荐

  1. Jetpack-Compose之三附带效应(副作用)

    一.Compose组合函数的特点 1.Compose组合函数执行顺序不定 可组合函数并不是按顺序执行的,这些函数可以按任何顺序运行(Compose 可以选择识别出某些界面元素的优先级高于其他界面元素, ...

  2. 了解 Jetpack Compose 中的重组

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

  3. tracepro杂散光分析例子_AES分析中的干扰效应及校正,你知道吗?

    2019-12-23 10:00:03 来源: AES分析中的干扰效应及校正-检测家 在原子发射光谱(AES)分析中存在的干扰效应会对样品的测量结果产生系统误差或偶然误差.干扰现象依据产生的机理可分为 ...

  4. 【flink】Flink 中的木桶效应:单个 subtask 卡死导致整个任务卡死

    1.概述 转载:Flink 中的木桶效应:单个 subtask 卡死导致整个任务卡死 工作或者面试中一般都要求面试者有较强的独立解决问题的能力,解决问题的前提是:我们对相应组件的原理非常清楚.本文先讲 ...

  5. cdma特有效应_cdma系统中的远近效应

    吴永海 孙甲琦 郭黎利 摘要:介绍了 CDMA 移动通信系统中目前正在使用和处于研究阶段的抗远近效应技术,并 对它们进行了比较. 关键词:多址干扰,远近效应,功率控制,多用户检测,自适应检测 1 CD ...

  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中的Modifier修饰符

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

最新文章

  1. 写文章 TEE技术分析【转】
  2. asp.net core mvc 异步表单(Ajax.BeginForm)
  3. 使用grep实现精确过滤的五种方法
  4. jsp内置对象作业3-application用户注册
  5. mybatis 数组 添加_Mybatis配置文件中Insert 元素标签添加配置有哪些呢?
  6. Software Defined Perimeter白皮书
  7. double operator[](int i)_请谨慎使用float和double
  8. Scihub永久链接
  9. WPF学习笔记(6):DataSet更新后台数据库个别列失败的问题
  10. JAVA反射构建对象
  11. 面试官:问你期望的工资是多少,怎么回答最好?
  12. pom文件导入maven依赖
  13. qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in
  14. 如何使用shell限制指定用户shell程序的网络带宽
  15. 天地图和谷歌地图静态图像素坐标和经纬度坐标互转
  16. 今日收获(数据库方向)
  17. GraphSAGE论文阅读笔记
  18. 如何解决高度塌陷【超全面】
  19. 笔记:物化的技术进步
  20. 获取树结构JAVA代码设计

热门文章

  1. 解决OpenCV捕捉USB摄像头时抓帧失败的问题
  2. 【OBS】解决OBS推两个rtmp流 + 带时间戳问题
  3. Token是什么玩意
  4. 设计一套简单的计算机系统及其指令系统,【精品】计算机组成综合设计指导书...
  5. Error contacting service. It is probably not running.
  6. TaefTestParser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
  7. Timer定时器详解
  8. Android 刘海屏适配全攻略
  9. Docker 从入门到精通
  10. JVM的Metaspace,JAVA8以前是Permanent Area