当前位置: 首页 > news >正文

Compose中的副作用-状态与作用域

进入组合->重组 0 次或多次->离开组合

LaunchedEffect

@Composable public fun LaunchedEffect( key1: Any?, block: suspend CoroutineScope.() -> Unit ): Unit

在@Composable方法的范围内运行协程函数
若想在composable的整个生命周期内执行相关操作,并能够调用协程函数,可使用LaunchedEffect。LaunchedEffect进入组合时,它会启动一个协程,并将相应的代码块作为参数传递给该协程。如果LaunchedEffect离开组合时,那么该协程就会被取消。如果key1的键值发生变化时,现有的协程会被取消,新的协程函数则会在新的协程中执行。

rememberCoroutineScope

@Composable public inline fun rememberCoroutineScope( crossinline getContext: @DisallowComposableCalls (() -> CoroutineContext) = { EmptyCoroutineContext… ): CoroutineScope

获取一个能够识别组件结构的launch,从而在composable外启动协程
由于LaunchedEffect是一个组合内函数,因此它只能在其他组合函数中使用。如果想在一个组合函数之外启动一个协程,同时确保该协程在离开其所在的组合结构后能被自动取消,那么可以使用rememberCoroutineScope这种方式。另外,当需要手动控制一个或多个协程的生命周期时,也可以使用rememberCoroutineScope。当调用离开该组合结构后,该作用域也会随之被取消。

rememberUpdatedState

@Composable public fun <T> rememberUpdatedState( newValue: T ): State<T>

如果你不想重组,但你又想你执行的方法是最新的。
当某个关键参数发生变化时,LaunchedEffect会重新启动。不过在某些情况下,你可能希望记录下该参数的当前值。如果这个值发生了变化,你就不希望效果重组。为此,需要使用rememberUpdatedState来创建对该值的引用,这样就可以随时获取并更新该值的数值。这种方法特别适用于那些包含耗时较长、重新执行成本较高的操作的效果。

DisposableEffect

@Composable public fun DisposableEffect( key1: Any?, effect: DisposableEffectScope.() -> DisposableEffectResult ): Unit

给予一个执行需要清理的资源代码块
如果在key1发生变化后或离开组合时需要清除某些资源,应使用DisposableEffect来进行处理。

SideEffect

@Composable public fun SideEffect( effect: () -> Unit ): Unit

将Compose状态同步到非Compose代码中
若要将Compose状态共享给那些不由Compose管理的对象,可以使用SideEffect可组合组件。使用SideEffect能确保相关操作在每次重新组合之后都能被执行。

produceState

@Composable public fun <T> produceState( initialValue: T, key1: Any?, producer: suspend ProduceStateScope<T>.() -> Unit ): State<T>

将非Compose状态转换为Compose状态
produceState会创建一个与特定Composition相关的协程,该协程可以将数据值添加到返回的State中。可以利用它将那些不属于Composition范畴的状态转换为Composition所能处理的状态。例如,可以将基于订阅机制产生的状态,如Flow、LiveData或RxJava中的数据,转换成Composition能够使用的数据格式。

derivedStateOf

@StateFactoryMarker public fun <T> derivedStateOf( calculation: () -> T ): State<T>

创建一个计算属性,只有当依赖的状态变化且计算结果也变化时,才触发重组
在Compose中,每当某个状态对象或可组合元素的输入发生变化时,就会触发重新组合操作。不过,状态对象或输入的变化频率可能高于UI实际需要更新的频率,从而导致不必要的重新组合。当可组合元素的输入变化频率高于重新组合的必要频率时,应使用derivedStateOf函数。

注意:使用derivedStateOf会消耗较多性能,因此只有当结果没有发生变化时,才应使用此方法来避免不必要的重新渲染

snapshotFlow

public fun <T> snapshotFlow( block: () -> T ): Flow<T>

将Compose的状态转换为Flow形式
使用snapshotFlow可以将State<T>对象转换为cold Flow。当这些对象被收集时,snapshotFlow会执行其中的代码,并输出所读取的State对象的内容。如果snapshotFlow中读取到的某个State对象的值发生了变化,且新值与之前输出的数值不同,那么该流就会将新值发送给收集器(这一行为与Flow.distinctUntilChanged类似)。

http://www.jsqmd.com/news/939508/

相关文章:

  • 新手福音:通过快马平台零基础学习codex cli开发,轻松掌握命令行工具
  • 中文新闻分类实战包:含BERT配置、THUCNews样本与完整训练代码
  • 基于 Harmony 6.0 应用的快递代收点管理系统首页实现
  • 单细胞分析避坑指南:你的Harmony批次矫正真的做对了吗?
  • 金融文本分类技术演进:从TF-IDF到Qwen3-8B
  • 视觉智能革命:当AI学会瞄准,游戏体验的范式转变
  • 从零开始电路设计:光控LED夜灯实战与PCB制作全流程
  • Boltzmann-Shannon指数(BSI):熵理论在聚类评估中的创新应用
  • 2026珍珠棉技术选型推荐:白色珍珠棉/防震气泡袋/epe珍珠棉包装/epe珍珠棉气泡袋/靠谱供应商实测对比 - 优质品牌商家
  • 2026年Q2河南高性价比专科院校实测评测 - 优质品牌商家
  • 361度“截胡”耐克老兵:百亿黑马的野心,不止于“高质价比”
  • 告别AT指令报错!手把手教你为ESP8266刷入MQTT固件,轻松连上阿里云
  • 别再乱用strtok了!C语言字符串分割的5个常见坑点与安全替代方案
  • 汽车托运价格贵吗
  • 告别低效排查:基于快马平台打造crash日志自动化分析助手
  • 从夯到拉!免费网络爬虫工具TOP8:按使用案例和使用限制2026年最新排名
  • 免费开源CAD软件LitCAD:如何快速上手专业二维绘图工具
  • 高考报志愿必看!计算机8大专业避坑全攻略
  • 2026年现阶段浙江市场异形门芯板铣边机企业深度剖析:锐科机械何以脱颖而出? - 2026年企业资讯
  • 别再乱找了!联想ThinkSystem全系列服务器Windows驱动兼容性清单与下载指北
  • 告别云端焦虑:手把手教你用Python脚本将Memos数据无缝迁移到Obsidian
  • 2026年新消息:重庆路灯电池加工厂可靠推荐,哈珠新能源为何脱颖而出? - 2026年企业资讯
  • 如何在Linux上搭建完整的微信小程序开发环境:终极指南 [特殊字符]
  • PoeCharm:Path of Building 中文终极指南,告别英文困扰的流放之路神器
  • 终极指南:ctfileGet项目如何免费突破城通网盘限速实现高速下载
  • 最新发现:九个 X.Org 服务器及 XWayland 组件安全漏洞待修复
  • 别再为MQTT AT指令报ERROR发愁了!手把手教你给ESP8266刷固件连阿里云
  • 从Trinity组装到蛋白预测:手把手教你用TransDecoder v5.7.1搞定转录组ORF分析(附BLAST/Pfam联用技巧)
  • 如何构建一个稳定赚钱的 Agent SaaS
  • Kotlin 协程设计思想(三):Dispatchers 到底是什么?切线程真的只是切线程吗?