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. Deeply motivated by challenges and tends to be excited by breaking conventional ways of thinking and doing. He builds fun and creative apps.

No responses yet