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

Jetpack Compose中MutableTransitionState的currentState取值异常问题

问题根因

你没有捕获到Invisible状态不是逻辑错误,而是日志打印的位置不对:

  • AnimatedVisibility的默认机制是,当退出动画完全执行完成、MutableTransitionState进入isIdle = true && currentState = false的Invisible状态时,会直接把内部包裹的所有内容(你的ItemCard)从Composition中移除,不再参与任何重组。
  • 你的状态打印逻辑写在ItemCard内部,当动画跑完要触发Invisible状态更新时,ItemCard已经被销毁了,自然不会执行最后一次打印逻辑,所以你看不到Invisible的日志,实际上animationState本身是已经切换到Invisible状态的。

修复方案

你需要把状态监听逻辑移到AnimatedVisibility的外层,和animationState同层级,就可以正常捕获到Invisible状态,完成条目移除操作:

  1. 首先给LazyColumn的items方法绑定唯一key,避免条目复用导致动画状态错乱,同时remember动画状态时也绑定item的唯一标识
  2. 用LaunchedEffect + snapshotFlow监听动画状态变化,在Invisible状态触发时执行数据源删除逻辑

修改后的LazyColumn条目代码参考:

// 给items绑定唯一key,此处假设你的item有id字段作为唯一标识
items(items, key = { it.id }) { item ->
    val animationState = remember(item.id) {
        MutableTransitionState(false)
    }.apply { targetState = true }

    // 外层监听动画状态,不受内部内容移除影响
    LaunchedEffect(animationState) {
        snapshotFlow { animationState.transitionState() }
            .distinctUntilChanged()
            .filter { it == TransitionState.Invisible }
            .collect {
                // 动画完全结束,从数据源移除对应条目
                viewModel.removeItem(item)
            }
    }

    AnimatedVisibility(
        visibleState = animationState,
        enter = slideInVertically() + fadeIn(),
        exit = slideOutHorizontally(
            targetOffsetX = { it*2 },
            animationSpec = tween(durationMillis = 700)
        )
    ) {
        ItemCard(
            item = item,
            viewModel = viewModel,
            animationState = animationState
        )
    }
}

内容的提问来源于stack exchange,提问作者Calamity

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:57:04