Jetpack Compose中remember与rememberUpdatedState的区别是什么?
remember { mutableStateOf() } 与 rememberUpdatedState() 的功能及场景差异
你观察到的没错,rememberUpdatedState 内部确实基于 remember { mutableStateOf() } 实现,二者的核心差异就是 rememberUpdatedState 多了每次重组自动同步最新传入值的逻辑,具体区别如下:
核心功能差异
val variable by remember { mutableStateOf(initValue) }
初始化时传入的initValue仅在首次 Composition 时生效,后续重组过程中remember代码块不会重新执行,状态值不会跟随initValue的变化自动更新,除非你为remember显式指定变更 Key,Key 变化时才会重新初始化状态实例。val variable by rememberUpdatedState(newValue)
内部持有的 State 实例和remember { mutableStateOf() }一样会在重组中持久化,不会重复创建,但每次重组都会自动执行赋值逻辑把最新的newValue同步到 State 实例中,不需要修改 Key,你拿到的永远是最新的传入值。
适用场景差异
使用 remember { mutableStateOf() } 的场景
适合需要内部自主管理的可变状态,状态初始化完成后不需要跟随外部参数自动更新,状态变化仅由内部逻辑触发,比如界面交互产生的状态:
@Composable fun SwitchDemo() { // 开关状态首次初始化时为false,后续重组不会被重置,仅由用户点击操作修改 val isChecked by remember { mutableStateOf(false) } Switch(checked = isChecked, onCheckedChange = { isChecked = it }) }
使用 rememberUpdatedState() 的场景
适合在长时间存活的副作用(LaunchedEffect、DisposableEffect 等)中引用外部可能变化的参数,同时不希望因为参数变化重启副作用。比如你需要执行一个固定时长的动画,动画过程中外部传入的结束回调更新了,你不希望动画重启,又希望动画结束时调用最新的回调:
@Composable fun SplashScreen(onJumpToHome: () -> Unit) { // 持久化State实例,同时自动同步最新的onJumpToHome回调 val latestOnJump by rememberUpdatedState(onJumpToHome) // Key设为Unit,仅首次进入时执行一次延迟逻辑,不会因为回调变化重启 LaunchedEffect(Unit) { delay(2000) // 调用的永远是最新的回调实例,不会出现逻辑过时的问题 latestOnJump() } Text("欢迎使用") }
要是上述场景不用
rememberUpdatedState,直接在LaunchedEffect里引用外部的onJumpToHome,你拿到的永远是首次执行副作用时的旧回调,就算重组时传入了新的回调,最终执行的还是旧版本,会导致逻辑错误。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

