Jetpack Compose导航是否属于配置变更?remember状态丢失是否为预期行为?
问题结论
这是remember {}的完全预期行为,Compose页面间导航后返回的操作不属于配置变更。
1. remember的生命周期特性
remember存储的状态完全和它所在的Composable在Composition中的生命周期绑定:
- 当你调用
navController.navigate("NextView")时,MainView会被完全移出Composition树,remember持有的状态会被同步销毁 - 你点击返回回到
MainView时,MainView会重新进入Composition,remember { mutableStateOf("Message") }会重新执行初始化,所以之前修改的内容会丢失。
2. 导航返回不属于配置变更
Android的配置变更指的是屏幕旋转、系统语言切换、深色模式切换、字体大小调整等会触发Activity重建的系统事件。导航操作是应用内的页面跳转,不会触发Activity重建,和配置变更完全是两类场景。
补充:你如果在
MainView页面旋转屏幕,也会发现remember修饰的message被重置,这也是remember的预期表现,原因是配置变更触发Activity重建,整个Composition树重新构建,remember的状态也会被销毁。
3. rememberSaveable能保留状态的原因
rememberSaveable不会把状态存在Composition的内存中,而是会序列化后存储到SavedStateRegistry中:
- 针对导航场景:每个Navigation目的地对应的
NavBackStackEntry都有独立的SavedStateHandle,rememberSaveable会把状态存在当前目的地的SavedStateHandle里,就算目的地对应的Composable暂时被移出Composition,状态也不会丢失,返回时会自动恢复。 - 针对配置变更场景:
SavedStateRegistry在Activity重建时会被保留,所以rememberSaveable的状态在配置变更后也能正常恢复。
额外说明
你使用的依赖版本不存在兼容问题,这个表现是Jetpack Compose和Navigation Compose的设计特性,不需要额外调整,需要跨导航/配置变更保留的状态直接用rememberSaveable即可。
内容的提问来源于stack exchange,提问作者Andy Hill
相关产品推荐
相关产品推荐

