前言
- 為什麼要閱讀本書
- 本書不包含什麼
- 為什麼要寫關於內部原理
- 保持對原始碼的關注
- 程式碼片段和範例
1. 可組合函數
- 可組合函數的含義
- 可組合函數的特性
- 調用上下文
- 冪等性
- 避免不受控制的副作用
- 可重新啟動
- 快速執行
- 位置記憶化
- 與 suspend 函式的相似之處
- 可組合函數的顏色
- 可組合函數類型
2. Compose 編譯器
- Kotlin 編譯器外掛程式
- Compose 註解
- 註冊編譯器擴充功能
- Kotlin 編譯器版本
- 靜態分析
- 靜態檢查器
- 呼叫檢查
- 型別檢查
- 宣告檢查
- 診斷抑制
- 執行時期版本檢查
- 程式碼生成
- Kotlin IR
- 降級
- 推斷類別穩定性
- 啟用即時字面值
- Compose lambda 記憶化
- 注入 Composer
- 比較傳播
- 預設參數
- 控制流程群組生成
- Klib 和替身的產生
3. Compose 運行時
- 插槽表和變更列表
- 深入理解插槽表
- 更改列表
- Composer(組合器)
- 餵養 Composer
- 對變更進行建模
- 優化寫入時機
- 寫入和讀取群組
- 記住值
- 重組範圍
- Composer 中的 SideEffects
- 存儲 CompositionLocals
- 存儲源信息
- 通過 CompositionContext 連接組合
- 訪問當前狀態快照
- 導覽節點
- 保持讀取器和寫入器同步
- 應用變更
- 建立節點樹時的效能
- 如何應用更改
- 附加和繪製節點
- Composition(組成)
- 創建 Composition
- 初始組合過程
- 初始組合後應用更改
- 關於組合的其他信息
- Recomposer
- 啟動 Recomposer
- 重組過程
- 併發重組
- Recomposer 的狀態
4. Compose UI
- 將 UI 與 Compose 運行時整合
- 將預定更改映射到樹的實際更改
- Compose UI 視角下的組合
- 從 Compose UI 的角度看 Subcomposition
- 在 UI 中反映變更
- 不同類型的應用器
- 具現化新的布局節點
- 完整流程
- 實體化移除節點的變更
- 實現移動節點的變更
- 實現清除所有節點的變更
- Compose UI 中的測量過程
- 測量政策
- 固有測量
- 佈局約束
- LookaheadLayout
- 建模修飾符鏈
- 將修飾符設置到 LayoutNode
- LayoutNode 如何處理新的修飾符
- 繪製節點樹
- Jetpack Compose 中的語義
- 通知語意變更
- 已合併和未合併的語意樹
5. 狀態快照系統
- 什麼是快照狀態
- 並發控制系統
- 多版本並行控制(MCC 或 MVCC)
- 快照
- 快照樹
- 快照和執行緒
- 觀察讀取和寫入
- 可變快照
- GlobalSnapshot 與巢狀快照
- StateObjects 和 StateRecords
- 讀取和寫入狀態
- 移除或重用過時記錄
- 變更傳播
- 合併寫入衝突
6. 效果與效果處理器
- 認識副作用
- Compose 中的副作用
- 我們的需求
- 效果處理器
- 非暫停效果
- 暫停效果
- 第三方函式庫適配器
7. Compose Runtime 的進階使用案例
- Compose runtime 與 Compose UI 的區別
- (重新)認識 composition
- 向量圖形的組合
- 構建向量圖像樹
- 將向量組合整合到 Compose UI
- 使用 Compose 管理 DOM
- 在瀏覽器中的獨立組合
- 結論




