rememberUpdatedState 官方解釋就不扯這么多了,知道怎么用就完了殖演。
其實(shí)就是把一個(gè)非狀態(tài)的參數(shù)變成有有狀態(tài)
直接上例子 注意注釋
@Composable
fun Greeting() {
//這是一個(gè)有狀態(tài)的btnColor
var btnColor by remember {
mutableStateOf("unknown")
}
//方式一:將btnColor作為參數(shù)傳遞到另一個(gè)可組合方法中
timer(btnColor = btnColor)
//方式二:直接使用btnColor
LaunchedEffect(key1 = Unit, block = {
delay(8000)
//因?yàn)樵谶@個(gè)作用域里氧秘,btnColor是有狀態(tài)的,所以延遲過后能打出更新的值
Log.e(">>>", "out btnColor: $btnColor")
})
//點(diǎn)擊btn時(shí)剃氧,會(huì)重組敏储。
Column {
OutlinedButton(onClick = {
btnColor = "black"
}) {
Text(text = "black btn")
}
OutlinedButton(onClick = {
btnColor = "white"
}) {
Text(text = "white btn")
}
}
}
@Composable
fun timer(btnColor: String) {//這里的btnColor 是無(wú)狀態(tài)的
Log.e(">>>", "compose: $btnColor")
//只有把無(wú)狀態(tài)的btnColor轉(zhuǎn)成有狀態(tài)的,也就是要state朋鞍,后續(xù)的改變值才能正常獲取,
//rememberUpdatedState的作用就是第一次進(jìn)入的時(shí)候生成一個(gè)新的有狀態(tài)的btnColor滥酥,第二次再進(jìn)
//去,直接出發(fā) apply 更新值缆蝉。
var rememberBtnColor = rememberUpdatedState(newValue = btnColor)
//單純用remember瘦真,是沒用的,因?yàn)闆]有狀態(tài)
// var rememberBtnColor = remember { btnColor }
//這樣也是沒用的原杂,第二次賦值導(dǎo)致rememberBtnColor
// 是一個(gè)新的對(duì)象您机,并不是改變狀態(tài)值年局,由于key1 = Unit 并不會(huì)更新LaunchedEffect里面的 { } 內(nèi)容
// var rememberBtnColor by remember(btnColor) {
// Log.e(">>>", "remember compose: $btnColor")
// mutableStateOf(btnColor)
// }
LaunchedEffect(key1 = Unit, block = {
delay(5000)
Log.e(">>>", "timer btnColor: $btnColor")
Log.e(">>>", "timer remember btnColor: ${rememberBtnColor}")
})
}