Compose 編譯器提供「高略過」模式。啟用後 會以兩種方式變更編譯器的行為:
,瞭解如何調查及移除這項存取權。啟用嚴格略過模式
如要為 Gradle 模組啟用嚴格略過功能,請在
Gradle 設定的 composeCompiler
區塊:
android { ... }
composeCompiler {
enableStrongSkippingMode = true
}
可組合函式可略過設定
強大的略過模式會放寬部分通常套用的穩定性規則 Compose 編譯器。變更者: 根據預設,Compose 編譯器會將可組合函式標示為可略過 其引數具有固定值強烈略過模式會改變這項設定。
啟用高強度略過功能後,所有可重新啟動的可組合函式都會變成 可略過無論參數是否不穩定,都適用這項規定。 無法重新啟動的可組合函式仍會保持不可略過。
何時可略過
為了判斷在重組期間是否要略過可組合項,Compose 會比較以下結果: 將每個參數的值和舊值搭配使用。比較類型 取決於參數的 stability。
- 系統會透過例項相等性 (
===
) 比較不穩定的參數 - 以物件相等性 (
Object.equals()
) 比較穩定的參數
如果所有參數都符合這些要求,Compose 會在以下期間略過可組合項 重組。
您可能會希望可組合項選擇停用高強度略過功能。也就是說,
您需要可重新啟動但不可略過的可組合函式。在這種情況下,請使用
@NonSkippableComposable
註解。
@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}
將類別加註為穩定版
如要使用物件等式而非例項相等性物件 繼續為指定類別加上註解 @Stable。以下舉例說明 方法是觀察整個物件清單,例如 因為 Room 會在使用者每次存取 相關變更
Lambda 備忘錄
強而有力的略過模式還能支援更多 lambda 的意義 位於可組合函式內啟用強大的略過功能後, 系統會自動記住可組合函式。
範例
使用強式略過功能時,為了在可組合函式內實現 lambda 的記憶,
編譯器會使用 remember
呼叫納入 lambda。金鑰使用
擷取 lambda 的所有字元。
假設有一個 lambda,如以下範例所示:
@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
val lambda = {
use(unstableObject)
use(stableObject)
}
}
啟用嚴格略過功能後,編譯器會將 lambda 納入計算
remember
呼叫:
@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
val lambda = remember(unstableObject, stableObject) {
{
use(unstableObject)
use(stableObject)
}
}
}
這些鍵遵循的比較規則與可組合函式相同。執行階段 使用例項等式比較不穩定的索引鍵。並採用 物件等式
記憶和重新組合
這項最佳化功能會大幅增加執行階段的可組合項數量 跳過次數。如果沒有記憶功能,執行階段 將新的 lambda 配置到於期間使用 lambda 參數的任何可組合項 重組。因此,新的 lambda 的參數不等於 最後一個樂曲這就會產生重組程序。
避免備忘錄
如果有不想總結的 lambda,請使用 @DontMemoize
註解。
val lambda = @DontMemoize {
...
}
APK 大小
編譯時,可略過的可組合函式產生的程式碼數量超過
可略過的可組合函式如果啟用嚴格略過功能,編譯器
幾乎所有可組合項都標示為可略過,並在
remember{...}
。因此啟用高強度略過模式
對應用程式 APK 大小的影響
在 Now In Android 中啟用強式略過功能,會增加 APK 乘以 4 KB大小差異主要取決於先前 特定應用程式中,但應該是不可略過的可組合函式 相對較小