rememberUpdatedState
看了官方文档关于rememberUpdatedState的一些用法说明,感觉说的并不是很清楚,于是写demo验证其作用:
页面说明:有两个btn,点击任何一个就会重组,会将btnColor的值改变,最终在LauchedEffect中delay几秒后将改变后的值打印出来。功能很简单。
// An highlighted block
@Composable
fun Greeting() {
var btnColor by remember {
mutableStateOf("unknown")
}
//方式一:将btnColor作为参数传递到另一个可组合方法中
timer(btnColor = btnColor)
//方式二:直接使用btnColor
LaunchedEffect(key1 = Unit, block = {
delay(8000)
Log.e(">>>", "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) {
Log.e(">>>", "compose: $btnColor")
var rememberBtnColor = rememberUpdatedState(newValue = btnColor)
LaunchedEffect(key1 = Unit, block = {
delay(5000)
Log.e(">>>", "btnColor: $btnColor")
Log.e(">>>", "btnColor: ${rememberBtnColor.value}")
})
}
直接说结论:
- 方式一:rememberUpdatedState配合LaunchedEffect使用时,btnColor为最新值,与预期一期;
- 方式二:直接使用时,也就是说不将btnColor作用参数传递时,不必使用ememberUpdatedState,btnColor的值也是最新的。
所以rememberUpdatedState的使用场景是在LaunchedEffect中保持可组函数的入参为最新值。