当你的可组合被重新组合时,如果你不想进行一些繁重的计算/操作,那么就需要使用
remember
。另一方面,有时候你的操作可能会发生变化,所以你需要进行计算或更新记忆的值,以确保不使用初始计算中的过时数值。
fun <T> rememberUpdatedState(newValue: T): State<T> = remember {
mutableStateOf(newValue)
}.apply { value = newValue }
rememberUpdatedState
函数与使用remember
和mutableState
触发重组的方式相同,当value
发生变化时。
@Composable
private fun Calculation(input: Int) {
val rememberUpdatedStateInput by rememberUpdatedState(input)
val rememberedInput = remember { input }
Text("updatedInput: $rememberUpdatedStateInput, rememberedInput: $rememberedInput")
}
var myInput by remember {
mutableStateOf(0)
}
OutlinedButton(
onClick = {
myInput++
}
) {
Text("Increase $myInput")
}
Calculation(input = myInput)
这是一个非常基本的例子,展示了
remember
和
rememberUpdatedState
中的
values
如何改变。
一个更实际的例子是使用lambda表达式。
例如,假设您的应用程序有一个
LandingScreen
,在一段时间后消失。即使
LandingScreen
被重新组合,等待一段时间并通知时间已过去的效果也不应重新启动:
@Composable
fun LandingScreen(onTimeout: () -> Unit) {
val currentOnTimeout by rememberUpdatedState(onTimeout)
LaunchedEffect(true) {
delay(SplashWaitTimeMillis)
currentOnTimeout()
}
}
在这个例子中,
LaunchedEffect
只被调用一次,但是这个LandingScreen函数可以被重新组合,并且可能需要你改变
onTimeOut
,所以使用
rememberUpdatedState
可以确保最新的
onTimeout
在延迟之后被调用。