rememberUpdatedState 官方解释就不扯这么多了,知道怎么用就完了。
其实就是把一个非状态的参数变成有有状态
直接上例子 注意注释
@Composable
fun Greeting() {
//这是一个有状态的btnColor
var btnColor by remember {
mutableStateOf("unknown")
}
//方式一:将btnColor作为参数传递到另一个可组合方法中
timer(btnColor = btnColor)
//方式二:直接使用btnColor
LaunchedEffect(key1 = Unit, block = {
delay(8000)
//因为在这个作用域里,btnColor是有状态的,所以延迟过后能打出更新的值
Log.e(">>>", "out btnColor: $btnColor")
})
//点击btn时,会重组。
Column {
OutlinedButton(onClick = {
btnColor = "black"
}) {
Text(text = "black btn")
}
OutlinedButton(onClick = {
btnColor = "white"
}) {
Text(text = "white btn")
}
}
}
@Composable
fun timer(btnColor: String) {//这里的btnColor 是无状态的
Log.e(">>>", "compose: $btnColor")
//只有把无状态的btnColor转成有状态的,也就是要state,后续的改变值才能正常获取,
//rememberUpdatedState的作用就是第一次进入的时候生成一个新的有状态的btnColor,第二次再进
//去,直接出发 apply 更新值。
var rememberBtnColor = rememberUpdatedState(newValue = btnColor)
//单纯用remember,是没用的,因为没有状态
// var rememberBtnColor = remember { btnColor }
//这样也是没用的,第二次赋值导致rememberBtnColor
// 是一个新的对象,并不是改变状态值,由于key1 = Unit 并不会更新LaunchedEffect里面的 { } 内容
// 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}")
})
}