You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:16:12