
先把结论放在前面:@Composable函数不是"普通函数加了注解",而是被编译器插件改写过的函数——它把"描述 UI 的代码"变成"向运行时描述树(SnapshotTree)注册一份描述",运行时由 Composition 负责组合、状态变化时按需重组。 理解这一点,就理解了 Compose 的各项特性:为什么没有控件引用、为什么重组可以跳过、为什么副作用需要单独声明。面试官验证 Compose 入门的真实功力有个土办法:聊坑。默认行为是什么、边界在哪、出错时是什么表现。背资料的人在这里会集体沉默。 所以这篇的重点放在三个必答的坑上。编译期与运行时的分工@Composable函数的处理分两个阶段:编译期(Compose Compiler Plugin):检查@Composable调用只能出现在@Composable上下文(这就是"Composable 函数只能从 Composable 函数调用"这条限制的来源)生成"重组作用域"标记($composer、$changed标记当前函数依赖了哪些状态)把状态读取位置编译成"依赖注册"——val x by state会被转成"当前重组作用域订阅了state