refactor: 日期检查器滑动删除添加动画等待完成后移除数据

This commit is contained in:
xfy 2026-06-01 17:15:14 +08:00
parent 23a7db1057
commit 877a3f9aa4

View File

@ -131,6 +131,7 @@ fun DateCheckerScreen(onBack: () -> Unit, modifier: Modifier = Modifier) {
) )
} }
var nextId by remember { mutableIntStateOf(3) } var nextId by remember { mutableIntStateOf(3) }
var pendingDeleteIds by remember { mutableStateOf(setOf<Int>()) }
var showDatePicker by remember { mutableStateOf(false) } var showDatePicker by remember { mutableStateOf(false) }
var datePickerTarget by remember { mutableStateOf<DatePickerTarget?>(null) } var datePickerTarget by remember { mutableStateOf<DatePickerTarget?>(null) }
@ -233,37 +234,39 @@ fun DateCheckerScreen(onBack: () -> Unit, modifier: Modifier = Modifier) {
.padding(horizontal = 16.dp, vertical = 4.dp) .padding(horizontal = 16.dp, vertical = 4.dp)
) { ) {
rows.forEachIndexed { index, row -> rows.forEachIndexed { index, row ->
val expiryDate = row.days?.let { productionDate.plus(DatePeriod(days = it)) } val isBeingDeleted = row.id in pendingDeleteIds
val daysRemaining = expiryDate?.let { today.daysUntil(it) }
val status = when {
daysRemaining == null -> ExpiryStatus.UNKNOWN
daysRemaining < 0 -> ExpiryStatus.EXPIRED
daysRemaining == 0 -> ExpiryStatus.URGENT
daysRemaining <= 7 -> ExpiryStatus.URGENT
daysRemaining <= 30 -> ExpiryStatus.WARNING
else -> ExpiryStatus.SAFE
}
val dismissState = rememberSwipeToDismissBoxState(
confirmValueChange = { value ->
if (value == SwipeToDismissBoxValue.EndToStart) {
rows = rows.filter { it.id != row.id }
true
} else {
false
}
}
)
key(row.id) { key(row.id) {
val dismissState = rememberSwipeToDismissBoxState(
confirmValueChange = { value ->
if (value == SwipeToDismissBoxValue.EndToStart) {
pendingDeleteIds = pendingDeleteIds + row.id
true
} else {
false
}
}
)
var visible by remember { mutableStateOf(false) } var visible by remember { mutableStateOf(false) }
androidx.compose.runtime.LaunchedEffect(Unit) { androidx.compose.runtime.LaunchedEffect(Unit) {
visible = true visible = true
} }
val expiryDate = row.days?.let { productionDate.plus(DatePeriod(days = it)) }
val daysRemaining = expiryDate?.let { today.daysUntil(it) }
val status = when {
daysRemaining == null -> ExpiryStatus.UNKNOWN
daysRemaining < 0 -> ExpiryStatus.EXPIRED
daysRemaining == 0 -> ExpiryStatus.URGENT
daysRemaining <= 7 -> ExpiryStatus.URGENT
daysRemaining <= 30 -> ExpiryStatus.WARNING
else -> ExpiryStatus.SAFE
}
AnimatedVisibility( AnimatedVisibility(
visible = visible, visible = visible && !isBeingDeleted,
enter = expandVertically( enter = expandVertically(
expandFrom = Alignment.Bottom, expandFrom = Alignment.Bottom,
animationSpec = androidx.compose.animation.core.spring( animationSpec = androidx.compose.animation.core.spring(
@ -314,6 +317,14 @@ fun DateCheckerScreen(onBack: () -> Unit, modifier: Modifier = Modifier) {
) )
} }
} }
if (isBeingDeleted) {
androidx.compose.runtime.LaunchedEffect(row.id) {
delay(400)
rows = rows.filter { it.id != row.id }
pendingDeleteIds = pendingDeleteIds - row.id
}
}
} }
if (index < rows.lastIndex) { if (index < rows.lastIndex) {