Compose中MutableTransitionState遇配置变更弹窗消失及Saver无效求助
解决Compose中MutableTransitionState配置变更状态丢失及Saver报错问题
你的问题出在rememberSaveable的泛型类型与自定义Saver不匹配:你用mutableStateOf(Holder(...))返回了MutableState<Holder>类型,但自定义的expandedSaver是针对Holder类型的,系统无法识别如何保存MutableState<Holder>,因此仍提示需要Saver。
下面是两种可行的修复方案:
方案一:直接为MutableTransitionState编写Saver(推荐)
不需要额外的Holder类,直接针对MutableTransitionState<Boolean>实现Saver,保存它的核心状态currentState即可:
// 为MutableTransitionState<Boolean>编写自定义Saver val transitionStateSaver = Saver<MutableTransitionState<Boolean>, Boolean>( save = { it.currentState }, // 保存当前弹窗展开状态 restore = { MutableTransitionState(it) } // 恢复时重建MutableTransitionState对象 ) @Composable fun SomeComposable() { // 使用rememberSaveable保存MutableTransitionState val expandedState = rememberSaveable(stateSaver = transitionStateSaver) { MutableTransitionState(false) } // 后续使用expandedState控制Popup动画 Popup( onDismissRequest = { expandedState.currentState = false }, visible = expandedState.currentState ) { // 弹窗内容 } }
方案二:修正Holder的使用方式
如果你坚持使用Holder类,需要让rememberSaveable直接保存Holder实例,而不是包裹在mutableStateOf中(rememberSaveable本身会维护状态,无需额外的MutableState):
data class Holder(var expandedState: MutableTransitionState<Boolean>) // 针对Holder的Saver val expandedSaver = Saver<Holder, Boolean>( save = { it.expandedState.currentState }, // 保存核心状态 restore = { Holder(MutableTransitionState(it)) } // 恢复时重建Holder和MutableTransitionState ) @Composable fun SomeComposable() { // 直接返回Holder实例给rememberSaveable val holder = rememberSaveable(stateSaver = expandedSaver) { Holder(MutableTransitionState(false)) } // 使用holder.expandedState控制弹窗 Popup( onDismissRequest = { holder.expandedState.currentState = false }, visible = holder.expandedState.currentState ) { // 弹窗内容 } }
两种方案都能解决配置变更后弹窗状态丢失的问题,同时消除Saver报错。推荐方案一,因为它更简洁,无需额外的Holder类。
内容的提问来源于stack exchange,提问作者kc_dev
相关产品推荐
相关产品推荐

