我有一个 SwipeToDismiss
实例来删除 dismissThresholds
75% 的项目。
如果用户滑动行太快而未达到 75% 阈值,则行将被删除。如何防止这种情况发生?
这是我执行操作的代码:
val dismissState = rememberDismissState(
confirmStateChange = {
if (it == DismissValue.DismissedToStart) {
viewModel.deleteCity(city)
}
true
}
)
最佳答案
我遇到了同样的问题,并找到了适合我的修复方法。我的理论是,当滑动速度非常快但没有走很远(没有达到设置的分数阈值)时,布局会立即重置。在本例中 (DismissToStart),意味着 View 弹回屏幕右侧边缘,为我们提供阈值 1.0f,从而触发确认状态更改,因为根据定义,该分数高于我们的阈值。问题是我们的阈值是从右屏幕边缘测量的,而这个分数(在我的理论中)是从左屏幕边缘测量的。
所以我的解决方案是跟踪当前的小数值,并在 confirmStateChange
中检查当前值是否高于阈值,但不是 1.0f。在现实世界中,我认为实际从右向左滑动手指不可能达到 1.0,因此该解决方案对我来说似乎是安全的。
val dismissThreshold = 0.25f
val currentFraction = remember { mutableStateOf(0f) }
val dismissState = rememberDismissState(
confirmStateChange = {
if (it == DismissValue.DismissedToStart) {
if (currentFraction.value >= dismissThreshold && currentFraction.value < 1.0f) {
onSwiped(item)
}
}
dismissOnSwipe
}
)
SwipeToDismiss(
state = dismissState,
modifier = Modifier.animateItemPlacement(),
directions = setOf(DismissDirection.EndToStart),
dismissThresholds = { direction ->
FractionalThreshold(dismissThreshold)
},
background = {
Box(...) {
currentFraction.value = dismissState.progress.fraction
...
}
}
dismissContent = {...}
)
关于android - Compose SwipeToDismiss 确认状态更改仅适用 >= 阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72676541/