Composition 中的 remember

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

John Lu
5 min readSep 22, 2022

今天的文章將延續上一篇「生氣紀錄本」的應用,將remember的行為以視覺化呈現。還沒讀過的同學,建議可以先到上一篇瀏覽範例程式碼,會比較好理解 contorl flow 和圖解。

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

當我們執行 app 時,畫面會顯示初始狀態:

右側是元件的樹狀結構簡圖,可以幫助我們深入瞭解狀態變更時發生的情況。系統會記住 countshowTask 等值。

我們現在可以在 app 內操作以下步驟:

  • 按下「I feel Anger!」(我感到怒怒) 按鈕。這樣做將會將 count 遞增 (並會觸發 recomposition),並開始顯示 WellnessTaskItem 和生氣次數的 Text
  • 按下 WellnessTaskItem 元件上的 X (會再度觸發 recomposition)。showTask 現在為 false,畫面不再顯示 WellnessTaskItem
  • 按下「I feel Anger!」(我感到怒怒) 按鈕 (再度觸發 recomposition)。如果我們再按更多次生氣按鈕,showTask 還是會在下次 recomposition 時記得 WellnessTaskItem已經被關掉了。
  • 按下「Clear angry count」(清除生氣次數) 按鈕,將 count 重設為 0並觸發 recomposition。這時,顯示 count的生氣次數Text,和任何 WellnessTaskItem 相關的程式碼都不會被呼叫,並且會離開 Composition。
  • 因為系統沒有呼叫到 showTask 的程式碼區塊,因此會移除 showTask。我們現在等同已經回到第一步了。
  • 按下「I feel Anger!」(我感到怒怒) 按鈕,讓 count 大於 0 (recomposition)。
  • 畫面會再度顯示 WellnessTaskItem composable,因為 showTask 在上文離開 Composition 的時候,系統已經清除此變數之前的值。

動動腦:如果我們要求 showTaskcount 變回 0 之後繼續保留,讓保留時間長過 remember 規定 (也就是 remember 所在的程式碼區塊並未在 recomposition 時被呼叫),具體要如何實現呢?

現在我們已經瞭解 UI 和狀態在離開 Composition 時會重設,明天我們會來探討「可觀察的 MutableList」。

此系列文章是以我的業餘專案: 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