Jetpack Compose 中的 state mutation

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

John Lu
Sep 21, 2022

remember 會把物件儲存在 Composition 內,當 recomposition 期間 remember 所在的 scope 沒有再度被呼叫時,則會清除該物件。

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

為了將這個行為以視覺化呈現,我們要在 app 內實作以下功能:如果使用者今天發了脾氣,就顯示一項可以「緩和情緒的任務」給使用者去做,而使用者也能選擇關閉任務。因為 composables 應該精簡且可供重複使用,我們來建立新的 composable 並命名為 WellnessTaskItem,讓這個 composable 將收到的 string 當做參數,並按照這個參數顯示「情緒緩和任務」,以及一個「關閉」圖示按鈕。

我們來建立新檔案 WellnessTaskItem.kt 並加入以下程式碼。我們在後續步驟中將會用到這個 composable function。

WellnessTaskItem 函式會接收「任務名稱」,以及 onClose lambda 函式做為參數 (就像內建的 Button composable 接收onClick 一樣)。

WellnessTaskItem 看起來會像這樣:

接著,我們來實作 AngryCounter 以便在 count > 0 時顯示 WellnessTaskItem

count 大於 0 時,定義變數 showTask 藉此定義是否要顯示 WellnessTaskItem,並初始化為 true

我們用 if 來判斷,在 showTasktrue 的時候顯示 WellnessTaskItem。運用我們前幾天學到的 remember API 來確定 recomposition 後依然可以保留 showTask

我們要來使用 WellnessTaskItemonClose lambda 函式,當有人按下 X 按鈕時,不要顯示任務,並將 showTask 變數更改為 false

接下來請新增一個 Button,寫上文字「Clear angry count」(清除生氣次數),然後把它放在「I feel Anger!」(我感到怒怒) Button 旁邊。我們可以使用 Row 來對齊這兩個按鈕。也可以在 Row 加入 padding。當有人按下「Clear angry count」(清除生氣次數) 的按鈕後,變數 count 就會重設為 0

我們的 AngryCounter composable function 應該會像下面這樣:

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

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

--

--

John Lu
John Lu

Written by John Lu

AI Engineer. Innovative and results-driven. Adept at deploying cutting-edge models with high-performance apps. He transforms challenges into practical solutions

No responses yet