今天來介紹進階 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 |
當第一次建立composition時會執行 LauchedEffect 內的程式碼。Block 內可以執行 suspend function。 他可以放入1~多個Key
,當 Key
值改變就會重新執行 block 內的程式碼。如果只想要執行一次可以用 Unit
傳入 Key
。
官方不建議使用 callBack 值存成 MutableState
給 LauchedEffect
作為 Key
值,要用 rememberCoroutineScope 來做這樣的效果。
他適合在即使某些參數變動也不需要 reset 的動作,例如倒數計時。
在 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 {
//下次初始化前要取消的事
}
}
}
昨天有介紹到他,他能記得 remember
一個 mutableStateOf
的值,並且在recomposition
後把這個值更新到初始化的變數上,來達成即使畫面旋轉資料也不會被重置的效果。
傳入非 state
的 value 並回傳 snapshot
State
來觸發重組。
回傳 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
今日運動
休息