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

Compose笔记(三)--DisposableEffect

        这一节了解一下DisposableEffect,它是一个可组合函数,主要用于在可组合项进入组合时执行初始化操作,并且在可组合项从组合中移除时执行相应的清理操作。其核心目的是管理与可组合项生命周期相关的资源,避免资源泄漏,比如注册和注销监听器、打开和关闭数据库连接等操作都可以借助它来完成。

 基本用法:

       DisposableEffect 接收一个或多个键(key)以及一个 Lambda 表达式。当可组合项首次组合时,会执行 Lambda 表达式中的代码。该 Lambda 表达式需要返回一个 DisposableEffectScope 类型的对象,其中包含一个 onDispose 方法,这个方法会在可组合项从组合中移除时被调用,用于执行清理操作。

import androidx.compose.runtime.*
import androidx.compose.material3.Text
import android.util.Log

@Composable
fun BasicDisposableEffectExample() {
    DisposableEffect(Unit) {
        // 初始化操作,例如注册监听器
        Log.d("DisposableEffect", "可组合项进入组合,执行初始化操作")

        // 定义清理操作
        onDispose {
            Log.d("DisposableEffect", "可组合项从组合中移除,执行清理操作")
        }
    }

    Text("这是一个基本的 DisposableEffect 示例")
}

分析:DisposableEffect 接收 Unit 作为键。当可组合项首次组合时,会打印初始化操作的日志;当可组合项从组合中移除时,会打印清理操作的日志。

import androidx.compose.runtime.*
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import android.util.Log

@Composable
fun DisposableEffectWithKeyExample() {
    var counter by remember { mutableStateOf(0) }

    DisposableEffect(counter) {
        // 初始化操作
        Log.d("DisposableEffect", "可组合项进入组合或键变化,当前计数器值: $counter,执行初始化操作")

        // 定义清理操作
        onDispose {
            Log.d("DisposableEffect", "可组合项从组合中移除或键变化,当前计数器值: $counter,执行清理操作")
        }
    }

    Button(onClick = { counter++ }) {
        Text("增加计数器")
    }
}

分析:DisposableEffect 的键是 counter。每次点击按钮使 counter 的值改变时,会先执行之前的清理操作,然后重新执行初始化操作。

 注意: 1 避免在 onDispose 中执行耗时操作,onDispose 方法会在可组合项从组合中移除时立即执行,因此不要在其中执行耗时操作,以免影响 UI 的流畅性。如果需要执行耗时操作,建议使用协程或其他异步机制。2 确保资源的正确释放,在 onDispose 方法中,要确保正确释放所有在初始化操作中获取的资源,避免资源泄漏。例如,如果在初始化时注册了监听器,在 onDispose 中要确保注销该监听器。

与 LaunchedEffect 的区别

       1 LaunchedEffect 主要用于在可组合项组合时启动协程执行异步操作,它关注的是异步任务的执行。

       2 DisposableEffect 更侧重于资源的管理,即初始化和清理操作。虽然 LaunchedEffect 也会在可组合项移除时取消协程,但它不是专门用于资源清理的。

 


http://www.kler.cn/a/530690.html

相关文章:

  • 对象的实例化、内存布局与访问定位
  • css三角图标
  • 洛谷 P10289 [GESP样题 八级] 小杨的旅游 C++ 完整题解
  • OpenAI 实战进阶教程 - 第二节:生成与解析结构化数据:从文本到表格
  • 100.2 AI量化面试题:在构建多因子选股模型时,如何有效处理因子之间的共线性问题?请给出具体的解决方案
  • MySQL 存储函数:数据库的自定义函数
  • 信息学奥赛一本通 2112:【24CSPJ普及组】地图探险(explore) | 洛谷 P11228 [CSP-J 2024] 地图探险
  • PyQt4学习笔记0】QtGui.QApplication
  • Node 处理客户端不同的请求方法
  • DeepSeek 原理解析:与主流大模型的差异及低算力优势
  • 【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户登录
  • 【数据结构与算法】力扣 5. 最长回文子串
  • [ VS Code 插件开发 ] 使用 Task ( 任务 ) 代替 createTerminal (终端) 来执行命令
  • 数据库和数据表的创建、修改、与删除
  • 冷启动+强化学习:DeepSeek-R1 的原理详解——无需监督数据的推理能力进化之路
  • 基于vue船运物流管理系统设计与实现(源码+数据库+文档)
  • 蓝桥杯学习笔记01
  • 【Qt】常用的容器
  • llama.cpp GGUF 模型格式
  • GWO优化SVM回归预测matlab
  • Mac怎么彻底卸载软件,简单彻底的卸载方式
  • 【数据结构-Trie树】力扣677. 键值映射
  • SQL/Panda映射关系
  • Spring Boot 2 快速教程:WebFlux处理流程(五)
  • 自制虚拟机(C/C++)(三、做成标准GUI Windows软件,扩展指令集,直接支持img软盘)
  • 轮转数组-三次逆置