我可以做到,SwipeToDismiss但我想將刷過的LazyColumn專案恢復到原始狀態。我不想洗掉刷過的專案,但想將其恢復到原始狀態。
我可以RecyclerView通過呼叫輕松實作這一點,notifyItemChanged()但無法弄清楚如何在LazyColumn.
下面是我的代碼:
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)}
)
}
}
uj5u.com熱心網友回復:
您可以等待currentValue變為非Default并重置狀態:
根據Thinking in Compose,可組合函式應該沒有副作用 - 您不應該直接重置可組合范圍內的狀態。對于這種情況,您需要使用一種特殊的副作用函式,更多資訊可以在副作用檔案中找到。
重組可以發生多次,影片期間最多一幀一次,不使用副作用函式會導致多次呼叫,從而導致影片問題。
作為DismissState.reset()一個suspend函式,LaunchedEffect非常適合這里:它已經在協程范圍內運行。
if (dismissState.currentValue != DismissValue.Default) {
LaunchedEffect(Unit) {
dismissState.reset()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/422374.html
標籤:
