Puedo hacer SwipeToDismiss pero quiero restaurar el elemento LazyColumn a su estado original. No quiero eliminar el elemento deslizado, pero quiero restaurarlo a su estado original.
Puedo lograr esto fácilmente en RecyclerView con solo llamar a notifyItemChanged() pero no sé cómo hacerlo en LazyColumn .
A continuación se muestra mi código:
val dataList = remember{ mutableStateListOf<ListItem>()} for(i in 0..100){ dataList.add(ListItem("$i", "'$i' is the item number.")) } LazyColumn(Modifier.fillMaxSize()){ items(dataList, key = {it.id}){ item -> val dismissState = rememberDismissState( confirmStateChange = { if(it == DismissedToEnd || it == DismissedToStart){ Handler(Looper.getMainLooper()).postDelayed({ //dataList.remove(item) }, 1000) } true } ) SwipeToDismiss( state = dismissState, directions = setOf(StartToEnd, EndToStart), dismissThresholds = { direction -> FractionalThreshold(if (direction == StartToEnd || direction == EndToStart) 0.25f else 0.5f) }, background = { val direction = dismissState.dismissDirection ?: return@SwipeToDismiss val color by animateColorAsState( targetValue = when(dismissState.targetValue){ Default -> Color.LightGray DismissedToEnd -> Color.Green DismissedToStart -> Color.Red } ) val icon = when(direction){ StartToEnd -> Icons.Default.Done EndToStart -> Icons.Default.Delete } val scale by animateFloatAsState( if (dismissState.targetValue == Default) 0.8f else 1.2f ) val alignment = when (direction) { StartToEnd -> Alignment.CenterStart EndToStart -> Alignment.CenterEnd } Box(modifier = Modifier .fillMaxSize() .background(color) .padding(start = 12.dp, end = 12.dp), contentAlignment = alignment ){ Icon(icon, contentDescription = "Icon", modifier = Modifier.scale(scale)) } }, dismissContent = {ItemScreen(dismissState = dismissState, item = item)} ) } }Puede esperar que currentValue se convierta en no Default y restablecer el estado:
De acuerdo con Thinking in Compose , la función componible debe estar libre de efectos secundarios; no debe restablecer directamente el estado en el ámbito componible. Para tales situaciones, debe usar una de las funciones especiales de efectos secundarios; puede encontrar más información en la documentación de efectos secundarios.
La recomposición puede ocurrir muchas veces, hasta una vez por cuadro durante la animación, y no usar funciones de efectos secundarios dará lugar a múltiples llamadas, lo que puede causar problemas de animación.
Como DismissState.reset() es una función de suspend , LaunchedEffect encaja perfectamente aquí: ya se está ejecutando en un ámbito de rutina.
if (dismissState.currentValue != DismissValue.Default) { LaunchedEffect(Unit) { dismissState.reset() } }