
先把結論放在前面:@Composable函數(shù)不是"普通函數(shù)加了注解",而是被編譯器插件改寫過的函數(shù)——它把"描述 UI 的代碼"變成"向運行時描述樹(SnapshotTree)注冊一份描述",運行時由 Composition 負責組合、狀態(tài)變化時按需重組。 理解這一點,就理解了 Compose 的各項特性:為什么沒有控件引用、為什么重組可以跳過、為什么副作用需要單獨聲明。面試官驗證 Compose 入門的真實功力有個土辦法:聊坑。默認行為是什么、邊界在哪、出錯時是什么表現(xiàn)。背資料的人在這里會集體沉默。 所以這篇的重點放在三個必答的坑上。編譯期與運行時的分工@Composable函數(shù)的處理分兩個階段:編譯期(Compose Compiler Plugin):檢查@Composable調用只能出現(xiàn)在@Composable上下文(這就是"Composable 函數(shù)只能從 Composable 函數(shù)調用"這條限制的來源)生成"重組作用域"標記($composer、$changed標記當前函數(shù)依賴了哪些狀態(tài))把狀態(tài)讀取位置編譯成"依賴注冊"——val x by state會被轉成"當前重組作用域訂閱了state