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
相关产品推荐
相关产品推荐

