讓 Compose 觀察 list item 值的變化

Kimoji:以 Jetpack Compose 實作一款「心情日記」應用 [25]

John Lu
Sep 28, 2022

此系列文章是以我的業餘專案: Kimoji 為範例。
這款以純 Jetpack Compose 撰寫的 side project,已經在 Google Play 上架。 歡迎試玩!
📥 立馬下載 | | | 🎟️ 限免兌換碼

在昨天的文章中無法順利選取標籤的問題,解決方法有兩種:

  • 變更 Label data class 的定義,將 checkedState 的型態從 Boolean改成 MutableState<Boolean>,這樣可以讓 Compose 觀察 item的變化。
  • 複製要更改的 item,從 List 中移除這個 item,然後把變動過的 item 重新加入清單,讓 Compose 觀察清單變更內容。

這兩種方法各有優缺點。舉例來說,根據 List 實作方式的不同,移除並讀取 element 可能非常耗費資源。

建議避免讓操作 List消耗太多資源,然後讓 checkedState 可被觀察,這樣做能夠提昇效能,也比較適合 Compose。

新的 Label 看起來可能會像這樣:

我們可以使用 property delegate,讓變數 checked 更加簡潔。

Label 從 data class 改成 class。讓 Label 在 constructor 接收 initialChecked 變數,預設值為 false,接下來,我們就能用 mutableStateOf factory method 初始化 checked 變數,並把 initialChecked 當做預設值。

大功告成!現在「多選標籤」能夠撐過 recomposition 和 configuration changes 了!

測試

因為我們將事務邏輯放進 ViewModel,而不是和 composable functions 耦合,這樣也讓 unit test 更容易進行了。

有興趣的話,可以進一步使用 instrumented test 確認 Compose 程式碼和 UI state 是否都能正常運作。

此系列文章是以我的業餘專案: Kimoji 為範例

Kimoji 是一款心情日記 App,讓你用可愛的 emoji 來撰寫你的心情日記。現在就來試試這款設計精美的微日記吧!
📥 立馬下載 | | | 🎟️ 限免兌換碼

--

--

John Lu
John Lu

Written by John Lu

AI Engineer. Deeply motivated by challenges and tends to be excited by breaking conventional ways of thinking and doing. He builds fun and creative apps.