当前位置: 首页 > 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.rkmt.cn/news/1450910.html

相关文章:

  • 金融文本分类技术演进:从TF-IDF到Qwen3-8B
  • Boltzmann-Shannon指数(BSI):熵理论在聚类评估中的创新应用
  • 2026珍珠棉技术选型推荐:白色珍珠棉/防震气泡袋/epe珍珠棉包装/epe珍珠棉气泡袋/靠谱供应商实测对比 - 优质品牌商家
  • 2026年Q2河南高性价比专科院校实测评测 - 优质品牌商家
  • 告别AT指令报错!手把手教你为ESP8266刷入MQTT固件,轻松连上阿里云
  • 别再乱用strtok了!C语言字符串分割的5个常见坑点与安全替代方案
  • 高考报志愿必看!计算机8大专业避坑全攻略
  • PoeCharm:Path of Building 中文终极指南,告别英文困扰的流放之路神器
  • 别再为MQTT AT指令报ERROR发愁了!手把手教你给ESP8266刷固件连阿里云
  • 如何构建一个稳定赚钱的 Agent SaaS
  • 辛格迪丨药企计算机化系统合规升级:全生命周期管控筑牢监管核查防线
  • 告别Spine?在Unity中低成本玩转DragonBones龙骨动画的完整配置与性能小贴士
  • WinForm桌面程序里直接跑Unity3D场景,C#和Unity实时互传数据
  • 01-Playwright 浏览器与上下文
  • 手把手解决Python 4大高频报错!新手90%都踩过
  • 避坑指南:在Ubuntu 20.04上从零搭建DAVE与UUV_Simulator水下仿真环境(含CUDA配置与常见报错解决)
  • 深入Linux内核:Livepatch如何实现函数“热替换”而不宕机?
  • 从CANoe到实车:UDS Flash刷写全流程自动化测试搭建指南(Python/ CAPL脚本)
  • 计算机毕业设计之资讯求真平台的设计与实现
  • 从MySQL分库分表到OceanBase分区:实战迁移中的那些坑与最佳实践
  • 训练1个电影级AI视频模型要多少算力?独家披露Netflix/腾讯影业联合实验室的3.7PB数据集构建逻辑与轻量化部署路径
  • 白盒测试——动态测试——逻辑覆盖法
  • 5分钟告别混乱:用Ice重新定义你的macOS菜单栏体验
  • 别再手动调参数了!用UE5材质函数快速搞定下雨积水效果(附完整材质蓝图)
  • MIPI I3C从设备Verilog实现方案:高性能嵌入式通信架构解析
  • 全光网与PON网络区别对比分析
  • 从实验设计到结果解读:RNA-seq数据归一化(RPKM/TPM)的常见误区与避坑指南
  • 2026年q2郑州优质专科学校选型推荐:郑州工业应用技术学院怎么样/郑州民办大学有那些/实测维度解析 - 优质品牌商家
  • MMD分裂准则在分布随机森林中的原理与应用
  • IAR环境下HT1621B驱动笔段式LCD的可烧录工程包(含调试脚本与硬件验证)