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

Android Jetpack Compose Snackbar:触发新Snackbar时如何立即关闭旧的?

解决Jetpack Compose中Snackbar队列问题:仅显示最新的Snackbar

问题场景:在包含LazyColumn的页面中,每行使用SwipeToDismiss组件,滑动删除行时会显示Snackbar,但频繁滑动会导致Snackbar排队依次显示,需要修改为触发新Snackbar时立即关闭旧的,只显示最新的。

问题原因

scaffoldState.snackbarHostState.showSnackbar()是挂起函数,会按调用顺序依次执行,上一个Snackbar关闭后才会显示下一个,因此频繁触发时会形成队列。

解决方案

在显示新Snackbar前,先关闭当前正在显示的Snackbar(如果存在),这样新的Snackbar就能直接显示,无需等待队列。

修改后的代码:

val scaffoldState = rememberScaffoldState()

LaunchedEffect(key1 = true) {
    viewModel.uiEvent.collect { event ->
        when (event) {
            is UiEvent.ShowSnackBar -> {
                // 立即关闭当前显示的Snackbar
                scaffoldState.snackbarHostState.currentSnackbarData?.dismiss()
                
                val snackbarResult = scaffoldState.snackbarHostState.showSnackbar(
                    message = event.message,
                    actionLabel = event.action
                )
                when (snackbarResult) {
                    SnackbarResult.Dismissed -> {}
                    SnackbarResult.ActionPerformed -> viewModel.onEvent(MessageListEvent.OnUndoDeleteClick)
                }
            }
            else -> Unit
        }
    }
}

关键说明

  • currentSnackbarData获取当前正在显示的Snackbar实例,调用dismiss()会立即关闭它。
  • 这一操作会中断原有Snackbar的生命周期,确保新Snackbar直接显示,不会进入等待队列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:39:58