Jetpack Compose中MutableTransitionState的currentState取值异常问题
问题根因
你没有捕获到Invisible状态不是逻辑错误,而是日志打印的位置不对:
AnimatedVisibility的默认机制是,当退出动画完全执行完成、MutableTransitionState进入isIdle = true && currentState = false的Invisible状态时,会直接把内部包裹的所有内容(你的ItemCard)从Composition中移除,不再参与任何重组。- 你的状态打印逻辑写在
ItemCard内部,当动画跑完要触发Invisible状态更新时,ItemCard已经被销毁了,自然不会执行最后一次打印逻辑,所以你看不到Invisible的日志,实际上animationState本身是已经切换到Invisible状态的。
修复方案
你需要把状态监听逻辑移到AnimatedVisibility的外层,和animationState同层级,就可以正常捕获到Invisible状态,完成条目移除操作:
- 首先给
LazyColumn的items方法绑定唯一key,避免条目复用导致动画状态错乱,同时remember动画状态时也绑定item的唯一标识 - 用
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
相关产品推荐
相关产品推荐

