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
相关产品推荐
相关产品推荐

