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

jetpack compose 副作用 LaunchedEffect

LaunchedEffect 跟组合走,进入启动、离开取消、key 变重启,解决的是"和组合生命周期同生同灭的协程副作用"这一类问题。

@Composable fun LaunchedEffect( key1: Any?, block: suspend CoroutineScope.() -> Unit ) { val applyContext = currentComposer.applyCoroutineContext remember(key1) { LaunchedEffectImpl(applyContext, block) } } private class LaunchedEffectImpl( private val parentContext: CoroutineContext, private val task: suspend CoroutineScope.() -> Unit ) : RememberObserver { private var scope: CoroutineScope? = null override fun onRemembered() { // ★ block 就是在这里被调用的 ★ scope = CoroutineScope(parentContext).apply { launch(block = task) // task == 你写的 block } } override fun onForgotten() { scope?.cancel() // 离开组合时取消 scope = null } override fun onAbandoned() { scope?.cancel() // remember 被丢弃时取消 scope = null } }

例子

一次性初始化

@Composable fun HomeScreen() { LaunchedEffect(Unit) { analytics.trackScreenView("home") // 埋点 sdk.initialize() // SDK 初始化 AppLogger.i("HomeScreen first composed") } HomeContent() }

响应式加载

@Composable fun DetailScreen(itemId: String, viewModel: DetailViewModel = viewModel()) { val uiState by viewModel.uiState.collectAsState() LaunchedEffect(itemId) { // itemId 变化时重新拉数据 viewModel.load(itemId) } when (uiState) { is Loading -> LoadingSpinner() is Success -> DetailContent((uiState as Success).data) is Error -> ErrorView((uiState as Error).message) } }

周期性更新(倒计时 / 轮询)

@Composable fun Countdown(seconds: Int, onTick: (Int) -> Unit, onEnd: () -> Unit) { LaunchedEffect(seconds) { repeat(seconds) { // 或者 while (isActive) { delay(1000); ... } delay(1000) onTick(seconds - it - 1) } onEnd() } } @Composable fun PollingCard(sessionId: String) { var status by remember { mutableStateOf(Status.PENDING) } LaunchedEffect(sessionId) { while (isActive) { // isActive 让取消能即时退出 status = api.poll(sessionId) if (status.isFinal()) break delay(2000) } } }

流订阅

@Composable fun MessageList(roomId: String, vm: ChatViewModel = viewModel()) { val messages by vm.messages(roomId).collectAsState() // 推荐:让 VM 暴露 StateFlow // 或者:直接在 Composable 里 collect(仅适合"纯展示流") val list = remember { mutableStateListOf<Message>() } LaunchedEffect(roomId) { chatService.observe(roomId).collect { msg -> list.add(msg) } } }
http://www.jsqmd.com/news/1323576/

相关文章:

  • 2026太原防水补漏全攻略|卫生间漏水免砸砖维修 阳台渗水补漏 外墙飘窗漏水修复 屋顶防水翻新 地下室堵漏 正规防水公司推荐 - 房屋-修缮
  • 2026年广州埃尔法包围隔音地板升级改装俱乐部推荐 - 品牌排行榜
  • 2026 AI学习路线图:小白程序员必备收藏,系统掌握大模型核心技术!
  • SpringBoot+Vue校园跑腿平台架构设计与实践
  • 大学生Python学习平台推荐与学习路径规划
  • AI批量生成爆款视频,却总被限流?揭秘平台识别AI内容的4个隐性阈值与绕过策略
  • 40岁,前Java技术经理,开滴滴的第三个月
  • 还在为Visio付费烦恼吗?draw.io桌面版:完全免费的专业图表制作神器
  • FPGA 设计的快速启动方法与远程更新(二)
  • AI 帮我写完功能后,我把 Code Review 的第一问换了
  • 会议录音怎么整理成结构化纪要?盘点4个AI会议总结工具,办公必备
  • 安卓SDK初始化顺序优化:解决安全误报问题
  • Windows右键菜单终极清理与定制指南:ContextMenuManager完全使用手册
  • 医疗电子病历界面设计:提升临床效率的关键技术
  • 2026年盐城GEO推荐系统公司咨询电话汇总 - 品牌排行榜
  • TikTok评论数据采集:浏览器自动化与结构化数据提取的工程实践
  • Protocol Buffers协议逆向与AES解密实战指南
  • 杰理蓝牙芯片解码功能开发与优化指南
  • FLAC3D预留核心土开挖技术详解与工程实践
  • C语言入门指南:从基础语法到开发实践
  • DMA传输性能优化:深入解析数据宽度与地址对齐的硬件约束
  • 2026 年现阶段禅城正规的管道疏通施工厂家推荐,去年花200请师傅通的,今天才发现这瓶1块钱的东西就能搞定? - 行业推荐官【认证】
  • PCSX2模拟器配置指南:在PC上完美运行PS2版《侠盗猎车手:圣安地列斯》
  • 手机自带工具mp4转mp3怎么选?盘点五款视频提取音频工具,附各平台实测对比
  • 2026年35正规HSW6系列开关柜供应商行业研究
  • 链表去重算法详解与实现技巧
  • 抖音批量下载终极指南:5分钟掌握无水印视频下载的专业方案
  • 北京婚姻律师谁比较好?为你推荐这几位 - 品牌排行榜
  • Unity 6编辑器界面全解析:从核心窗口到高级工作流优化
  • 打造个性化知识中心:Obsidian Homepage终极指南