Android Compose SwipeToDismiss快速滑动未达阈值仍触发删除的问题解决(confirmStateChange仅应≥阈值生效)
这个问题确实挺坑的——快速滑动时的惯性逻辑会绕开我们设置的阈值,导致误触发删除。别担心,我们可以通过在confirmStateChange里手动校验滑动进度来解决这个问题。
核心思路是:不要在状态要改变时直接执行删除,而是先检查当前的滑动进度是否真的达到了你设置的75%阈值,只有满足条件才执行操作并允许状态变更,否则阻止状态改变让条目回弹。
下面是修改后的完整代码示例:
首先定义我们的阈值常量(方便统一维护):
val dismissThreshold = 0.75f
然后创建DismissState时,在confirmStateChange里加入进度校验:
val dismissState = rememberDismissState( confirmStateChange = { newState -> if (newState == DismissValue.DismissedToStart) { // 获取当前滑动的进度比例(范围0到1) val currentSlideProgress = dismissState.progress.fraction // 只有当进度达到或超过阈值时,才执行删除并允许状态变更 if (currentSlideProgress >= dismissThreshold) { viewModel.deleteCity(city) true } else { // 未达到阈值,阻止状态变更,条目会自动回弹 false } } else { // 其他状态(比如从已删除状态回弹)默认允许变更 true } } )
最后在SwipeToDismiss组件中设置对应的阈值:
SwipeToDismiss( state = dismissState, directions = setOf(DismissDirection.EndToStart), dismissThresholds = { _ -> FractionalThreshold(dismissThreshold) }, background = { // 你的删除背景布局,比如红色背景加删除图标 Box( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.CenterEnd ) { Text( text = "删除", color = Color.White, modifier = Modifier.padding(end = 16.dp) ) } }, dismissContent = { // 你的城市条目内容布局 CityItem(city = city) } )
为什么这样有效?因为快速滑动时,Compose的惯性处理可能会提前触发状态变更的回调,但此时progress.fraction还没达到我们设置的阈值。通过手动校验这个值,我们就能确保只有当用户真的滑动了足够距离(75%)时,才会执行删除操作,否则条目会回弹回去,避免误删。
内容的提问来源于stack exchange,提问作者Artyom Danilin
相关产品推荐
相关产品推荐

