Compose SwipeToDismiss 确认状态更改仅适用 >= 阈值

Art*_*lin 2 android android-jetpack-compose

我有一个SwipeToDismiss实例删除了dismissThresholds75% 的项目。如果用户滑动行太快而未达到 75% 阈值,则行将被删除。如何预防呢?

这是我执行操作的代码:

val dismissState = rememberDismissState(
  confirmStateChange = {
    if (it == DismissValue.DismissedToStart) {
      viewModel.deleteCity(city)
    }
    true
  }
)
Run Code Online (Sandbox Code Playgroud)

小智 5

我遇到了同样的问题并找到了适合我的修复方法。我的理论是,当滑动速度非常快但没有走很远(没有达到设置的分数阈值)时,布局会立即重置。在本例中 (DismissToStart),意味着视图弹回屏幕右侧边缘,为我们提供阈值 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 = {...}
)
Run Code Online (Sandbox Code Playgroud)