你想知道的 Jetpack Compose 的编译器黑魔法
1、为什么Composable 函数的函数名可以大写?


Composable 函数会提示函数名大写,普通函数提示函数名要小写


Compose 的代码提示插件:

Composable命名规则:


2、为父么 Composable 函数的调用时绿色的?

其实,函数调用的颜色是可以配置的:

Compose 的定制配色方案就定义成绿色的:

3、为什么Composable 函数不能时suspend 函数?
编译器检查会报错:

原因:
- suspend 函数有协程上下文(副作用)
- suspend 函数可能会挂起
- suspend 函数的调度逻辑复杂,可能存在线程切换
编译器有Compose 的声明检查:

如果是 suspend 函数就会报错:

4、Composable 函数究竟有没有副作用?

普通的Composable 函数是如何被添加到布局中的呢?代码编译后会生成一个 Composer 对象,加到函数参数列表中:




5、Composable 函数是如何支持参数默认值的?
编译前的代码:

编译后:


Composable 函数变换:
- 添加 $composer 参数
- 添加 $default[n]参数,用于支持函数默认值
- 添加$changed[n] 参数,用于计算参数变化
- 关系到重组的逻辑
6、Composable 函数的重组是如何执行的?
重组的核心逻辑:
- 重组的条件判断
- 重组如何执行
重组的条件判断
编译前代码:

编译后:

skipToGroupEnd函数就是跳过重组,如何执行到这个分支呢?

分析下几个值的含义:



重组如何执行



