Compose 的穩定性

Compose 會將類型視為穩定或不穩定。如果類型是穩定的,則屬於穩定類型 不可變更,或者 Compose 能否知道其值是否 之間的差異如果 Compose 無法判斷某個類型是否不穩定 而這個值的值在重新組成之間已變更。

Compose 會根據可組合函式參數的穩定性,判斷其是否 可在重組期間略過可組合函式:

  • 穩定版參數:如果可組合項有沒有穩定參數 但 Compose 會略過這個步驟
  • 不穩定的參數:如果可組合項含有不穩定的參數,Compose 每次重組元件的父項時,一律都會重組該元件

如果應用程式包含許多不必要的元件,Compose 一律會將其 您可能會遇到效能問題和其他問題。

本文件詳細說明如何提升應用程式的穩定性,以便改進 效能和整體使用者體驗

不可變動的物件

下列程式碼片段示範了維持穩定性和 重組。

Contact 類別是不可變的資料類別。這是因為 則是以 val 關鍵字定義的基本參數。建立 Deployment 後 Contact 的例項,無法變更物件的屬性值。 如果您嘗試執行這項操作,就需要建立新物件。

data class Contact(val name: String, val number: String)

ContactRow 可組合函式含有 Contact 類型的參數。

@Composable
fun ContactRow(contact: Contact, modifier: Modifier = Modifier) {
   var selected by remember { mutableStateOf(false) }

   Row(modifier) {
      ContactDetails(contact)
      ToggleButton(selected, onToggled = { selected = !selected })
   }
}

考量使用者點按切換鈕及 selected 項狀態變更:

  1. Compose 會評估是否應重組 ContactRow 中的程式碼。
  2. 您會發現 ContactDetails 的唯一引數是 Contact 類型。
  3. 由於 Contact 是不可變更的資料類別,因此 Compose 不會確保 ContactDetails 的引數已變更。
  4. 因此,Compose 會略過 ContactDetails,不會重組。
  5. 另一方面,ToggleButton 的引數已變更,且 Compose 會重新組成該元件。

可變動的物件

雖然上述範例使用不可變動的物件,但還是可以建立 可變動物件請考慮以下程式碼片段:

data class Contact(var name: String, var number: String)

由於 Contact 的每個參數現在都是 var,類別已不可變更。 如果屬性有變動,Compose 就看不見。這是因為 Compose 只會追蹤 Compose 狀態物件的變更。

Compose 會認為這類類別不穩定。Compose 不會略過 不穩定的類別。因此,如果以這種方式定義 ContactContactRow 的上一個範例會在 selected 變更時重組。

在 Compose 中實作

如果思考 Compose 究竟 以確定重組期間要略過的函式。

當 Compose 編譯器在程式碼上執行時,會標示每個函式和類型 加入一組代碼這些標記反映了 Compose 處理函式或 重新組成期間的型別。

函式

Compose 可將函式標示為 skippablerestartable。請注意, 將函式標示為一個、兩者皆用,或兩者皆不:

  • 可略過:如果編譯器將可組合項標示為可略過,Compose 可以 如果所有引數都等於 先前的值
  • 可重新啟動:可重新啟動的可組合函式,做為「範圍」在哪? 可以開始重組換句話說,函式可以是 項目,Compose 可在此後開始重新執行程式碼,以進行重組 狀態變更。

類型

Compose 會將類型標示為不可變動或穩定。每個類型都是 其他:

  • 不可變動:如果型別的值為不可變動,Compose 會將該類型標示為不可變動 屬性永遠無法變更,且所有方法的參照都是公開的。
    • 請注意,所有原始類型都會標示為不可變。包括 StringIntFloat
  • 穩定版:表示屬性在建構完成後可變更的類型。 如果這些屬性在執行階段期間有所變更,Compose 就會知道 這些變更
,瞭解如何調查及移除這項存取權。

偵錯穩定性

如果應用程式正在重組參數未變更的可組合項,請先 然後查閱該參數的定義,找出可明顯變更的參數。一律撰寫 如果傳入具有 var 屬性的類型,或 val 傳入類型,則會重組元件 使用已知不穩定類型的屬性。

如要進一步瞭解如何診斷 Compose 請參閱偵錯穩定性指南。

修正穩定性問題

如要瞭解如何提升 Compose 實作的穩定性,請參閱 修正穩定性問題指南。

摘要

整體而言,請注意以下幾點:

  • 參數:Compose 會決定每個參數的穩定性 判斷在測試期間應略過哪些可組合函式 重組。
  • 立即修正:如果您發現系統沒有略過可組合函式,並且 問題引發成效問題,建議您檢查 不穩定 (例如 var 參數)
  • 編譯器報表:您可以使用編譯器報告 判斷系統推測的類別穩定性。
  • 集合:Compose 總是認為集合類別不穩定,例如 做為 List, SetMap。這是因為無法保證委刊項 無法變更您可以改用 Kotlinx 不可變集合,或 為類別加註 @Immutable@Stable
  • 其他模組:Compose 總是認為來源不穩定 未執行 Compose 編譯器的模組。納入 UI 中的類別 和模型類別

其他資訊