You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose如何判断代码运行在Composition内部还是外部

核心的混淆点在于:你把「代码写在@Composable函数内部」和「代码运行在Composition上下文里」划了等号,这两个是完全不同的概念。

我们拆分代码A的执行时机你就懂了:

  • 当Compose执行重组、渲染CraneHome的UI树时,openDrawer = { ... } 这行只是把一个lambda函数作为参数传给CraneHomeContent,这个lambda本身此时根本不会执行,这个阶段的代码才是运行在Composition内部的。
  • 这个lambda实际执行的时机,是后续用户点击了界面上触发打开抽屉的按钮时,这个时候Compose的重组流程早就结束了,运行上下文是普通的Android主线程点击事件回调,完全脱离了Composition的执行过程,自然属于Composition外部的场景。

而LaunchedEffect的适用场景是:副作用需要在重组阶段就由Compose自动调度执行,比如代码B里的启动页计时逻辑,页面渲染完成就要开始倒计时,不需要等用户触发任何操作,所以它的执行时机是在Composition生命周期内,直接用LaunchedEffect即可。

最后再明确下规则的本质:判断用哪个API从来不看代码是不是写在@Composable的大括号里,而是看代码实际执行的时机:

  • 执行时机绑定Compose重组、在Composition生命周期内自动触发的协程任务,用LaunchedEffect
  • 执行时机在重组结束之后,由用户交互、外部事件回调触发的协程任务,用rememberCoroutineScope

内容的提问来源于stack exchange,提问作者HelloCW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:18:05