強式略過模式

Compose 編譯器提供「高略過」模式。啟用後 會以兩種方式變更編譯器的行為:

  • 包含不穩定參數的可組合項會變成可略過
  • 拍攝不穩定的 lambda 會記憶
,瞭解如何調查及移除這項存取權。

啟用嚴格略過模式

如要為 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大小差異主要取決於先前 特定應用程式中,但應該是不可略過的可組合函式 相對較小