iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0

前言


今天來介紹進階 State 和 Side Effect 。

依造昨天的慣性,先上結論表方便未來查找。

Effect_Name 更新畫面時機 執行動作 目的
LauchedEffect() compose 建立、Key 改變 block content 在特定條件下 Recompose
DisposableEffect() Key 改變、離開Compose clean LifeCycle 處理
rememberUpdatedState 資料變動 確保 value 最新值時更新
produceState 非ComposeState value 改變 更新 Compose State 非State 影響 State
derivedStateOf State.value 改變 更新 另一個 compose state State 影響 State

LauchedEffect


當第一次建立composition時會執行 LauchedEffect 內的程式碼。Block 內可以執行 suspend function。 他可以放入1~多個Key,當 Key值改變就會重新執行 block 內的程式碼。如果只想要執行一次可以用 Unit 傳入 Key

官方不建議使用 callBack 值存成 MutableStateLauchedEffect 作為 Key 值,要用 rememberCoroutineScope 來做這樣的效果。

他適合在即使某些參數變動也不需要 reset 的動作,例如倒數計時。

DisposableEffect


在 Recompose 前要確保某些動作會清空,再重新運作的話,就很適合放在這。例如需要保持唯一性的 request ,在下一次請求前需要先取消舊的請求。

DisposableEffect 中一定要寫 onDispose{ },並且放在最後一段。

import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember

@Composable
fun UserProfile(userRepository: UserRepository, userRequest: UserDataRequest) {
     DisposableEffect(Key) {
        //當Key 更新要初始化的事

        onDispose {
            //下次初始化前要取消的事
        }
    }
}

rememberUpdatedState


昨天有介紹到他,他能記得 remember 一個 mutableStateOf 的值,並且在recomposition 後把這個值更新到初始化的變數上,來達成即使畫面旋轉資料也不會被重置的效果。

produceState


傳入非 state 的 value 並回傳 snapshot State 來觸發重組。

derivedStateOf


回傳 State 物件,參數是某個 State.value 經過計算的結果。他可以將存在不同mutablestate 的值經過計算後再將結果觸發重組。

import androidx.compose.material.Text
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember

@Composable fun CountDisplay(count: State<Int>) {
    Text("Count: ${count.value}")
}

@Composable fun Example() {
    var a by remember { mutableStateOf(0) }
    var b by remember { mutableStateOf(0) }
    val sum = remember { derivedStateOf { a + b } }
    // a 或 b 改變觸發 CountDisplay 重組 ,而Example則不會重組 
    CountDisplay(sum)
}

參考

各個 API 的文檔
LaunchedEffect
rememberUpdatedState
DisposableEffect
produceState
derivedStateOf

實作這些 SideEffect 的 codelab

今日運動
休息


上一篇
Day 24 改了變數畫面卻不會更新嗎?你需要來點 State!
下一篇
Day 26 把主畫面組起來!
系列文
今年一定減成功!Jetpack Compose 做出重訓紀錄APP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言