fix: no fling swipe to dismiss workaround (#577)

This commit is contained in:
Diego Beraldin 2024-03-07 14:09:11 +01:00 committed by GitHub
parent 261e9c5c60
commit 94c6c9349a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -5,22 +5,24 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.SwipeToDismissBox import androidx.compose.material3.SwipeToDismissBox
import androidx.compose.material3.SwipeToDismissBoxDefaults
import androidx.compose.material3.SwipeToDismissBoxState
import androidx.compose.material3.SwipeToDismissBoxValue import androidx.compose.material3.SwipeToDismissBoxValue
import androidx.compose.material3.rememberSwipeToDismissBoxState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
@ -35,7 +37,7 @@ data class SwipeAction(
val onTriggered: () -> Unit, val onTriggered: () -> Unit,
) )
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun SwipeActionCard( fun SwipeActionCard(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
@ -50,7 +52,7 @@ fun SwipeActionCard(
var secondNotified by remember { mutableStateOf(false) } var secondNotified by remember { mutableStateOf(false) }
val gestureBeginCallback by rememberUpdatedState(onGestureBegin) val gestureBeginCallback by rememberUpdatedState(onGestureBegin)
var lastProgress by remember { mutableStateOf(0.0f) } var lastProgress by remember { mutableStateOf(0.0f) }
val dismissState = rememberSwipeToDismissBoxState( val dismissState = rememberNoFlingSwipeToDismissBoxState(
confirmValueChange = rememberCallbackArgs { value -> confirmValueChange = rememberCallbackArgs { value ->
when (value) { when (value) {
SwipeToDismissBoxValue.StartToEnd -> { SwipeToDismissBoxValue.StartToEnd -> {
@ -162,4 +164,34 @@ fun SwipeActionCard(
} else { } else {
content() content()
} }
} }
/**
* CREDITS:
* https://issuetracker.google.com/issues/252334353#comment16
*/
@Composable
@ExperimentalMaterial3Api
private fun rememberNoFlingSwipeToDismissBoxState(
initialValue: SwipeToDismissBoxValue = SwipeToDismissBoxValue.Settled,
confirmValueChange: (SwipeToDismissBoxValue) -> Boolean = { true },
positionalThreshold: (totalDistance: Float) -> Float =
SwipeToDismissBoxDefaults.positionalThreshold,
): SwipeToDismissBoxState {
// instead of LocalDensity.current we use a value that makes velocityThreshold to skyrocket
val density = Density(Float.POSITIVE_INFINITY)
return rememberSaveable(
saver = SwipeToDismissBoxState.Saver(
confirmValueChange = confirmValueChange,
density = density,
positionalThreshold = positionalThreshold
)
) {
SwipeToDismissBoxState(
initialValue = initialValue,
density = density,
confirmValueChange = confirmValueChange,
positionalThreshold = positionalThreshold
)
}
}