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
項狀態變更:
- Compose 會評估是否應重組
ContactRow
中的程式碼。 - 您會發現
ContactDetails
的唯一引數是Contact
類型。 - 由於
Contact
是不可變更的資料類別,因此 Compose 不會確保ContactDetails
的引數已變更。 - 因此,Compose 會略過
ContactDetails
,不會重組。 - 另一方面,
ToggleButton
的引數已變更,且 Compose 會重新組成該元件。
可變動的物件
雖然上述範例使用不可變動的物件,但還是可以建立 可變動物件請考慮以下程式碼片段:
data class Contact(var name: String, var number: String)
由於 Contact
的每個參數現在都是 var
,類別已不可變更。
如果屬性有變動,Compose 就看不見。這是因為
Compose 只會追蹤 Compose 狀態物件的變更。
Compose 會認為這類類別不穩定。Compose 不會略過
不穩定的類別。因此,如果以這種方式定義 Contact
,ContactRow
的上一個範例會在 selected
變更時重組。
在 Compose 中實作
如果思考 Compose 究竟 以確定重組期間要略過的函式。
當 Compose 編譯器在程式碼上執行時,會標示每個函式和類型 加入一組代碼這些標記反映了 Compose 處理函式或 重新組成期間的型別。
函式
Compose 可將函式標示為 skippable
或 restartable
。請注意,
將函式標示為一個、兩者皆用,或兩者皆不:
- 可略過:如果編譯器將可組合項標示為可略過,Compose 可以 如果所有引數都等於 先前的值
- 可重新啟動:可重新啟動的可組合函式,做為「範圍」在哪? 可以開始重組換句話說,函式可以是 項目,Compose 可在此後開始重新執行程式碼,以進行重組 狀態變更。
類型
Compose 會將類型標示為不可變動或穩定。每個類型都是 其他:
- 不可變動:如果型別的值為不可變動,Compose 會將該類型標示為不可變動
屬性永遠無法變更,且所有方法的參照都是公開的。
- 請注意,所有原始類型都會標示為不可變。包括
String
、Int
和Float
。
- 請注意,所有原始類型都會標示為不可變。包括
- 穩定版:表示屬性在建構完成後可變更的類型。 如果這些屬性在執行階段期間有所變更,Compose 就會知道 這些變更
偵錯穩定性
如果應用程式正在重組參數未變更的可組合項,請先
然後查閱該參數的定義,找出可明顯變更的參數。一律撰寫
如果傳入具有 var
屬性的類型,或 val
傳入類型,則會重組元件
使用已知不穩定類型的屬性。
如要進一步瞭解如何診斷 Compose 請參閱偵錯穩定性指南。
修正穩定性問題
如要瞭解如何提升 Compose 實作的穩定性,請參閱 修正穩定性問題指南。
摘要
整體而言,請注意以下幾點:
- 參數:Compose 會決定每個參數的穩定性 判斷在測試期間應略過哪些可組合函式 重組。
- 立即修正:如果您發現系統沒有略過可組合函式,並且
問題引發成效問題,建議您檢查
不穩定 (例如
var
參數) - 編譯器報表:您可以使用編譯器報告 判斷系統推測的類別穩定性。
- 集合:Compose 總是認為集合類別不穩定,例如
做為
List, Set
和Map
。這是因為無法保證委刊項 無法變更您可以改用 Kotlinx 不可變集合,或 為類別加註@Immutable
或@Stable
。 - 其他模組:Compose 總是認為來源不穩定 未執行 Compose 編譯器的模組。納入 UI 中的類別 和模型類別