你想知道的 Jetpack Compose 的編譯器黑魔法

1、為什么Composable 函數(shù)的函數(shù)名可以大寫(xiě)?


Composable 函數(shù)會(huì)提示函數(shù)名大寫(xiě),普通函數(shù)提示函數(shù)名要小寫(xiě)


Compose 的代碼提示插件:

Composable命名規(guī)則:


2、為父么 Composable 函數(shù)的調(diào)用時(shí)綠色的?

其實(shí),函數(shù)調(diào)用的顏色是可以配置的:

Compose 的定制配色方案就定義成綠色的:

3、為什么Composable 函數(shù)不能時(shí)suspend 函數(shù)?
編譯器檢查會(huì)報(bào)錯(cuò):

原因:
- suspend 函數(shù)有協(xié)程上下文(副作用)
- suspend 函數(shù)可能會(huì)掛起
- suspend 函數(shù)的調(diào)度邏輯復(fù)雜,可能存在線程切換
編譯器有Compose 的聲明檢查:

如果是 suspend 函數(shù)就會(huì)報(bào)錯(cuò):

4、Composable 函數(shù)究竟有沒(méi)有副作用?

普通的Composable 函數(shù)是如何被添加到布局中的呢?代碼編譯后會(huì)生成一個(gè) Composer 對(duì)象,加到函數(shù)參數(shù)列表中:




5、Composable 函數(shù)是如何支持參數(shù)默認(rèn)值的?
編譯前的代碼:

編譯后:


Composable 函數(shù)變換:
- 添加 $composer 參數(shù)
- 添加 $default[n]參數(shù),用于支持函數(shù)默認(rèn)值
- 添加$changed[n] 參數(shù),用于計(jì)算參數(shù)變化
- 關(guān)系到重組的邏輯
6、Composable 函數(shù)的重組是如何執(zhí)行的?
重組的核心邏輯:
- 重組的條件判斷
- 重組如何執(zhí)行
重組的條件判斷
編譯前代碼:

編譯后:

skipToGroupEnd函數(shù)就是跳過(guò)重組,如何執(zhí)行到這個(gè)分支呢?

分析下幾個(gè)值的含義:



重組如何執(zhí)行


標(biāo)簽: