From aedb3fee19f8d2cd4006e387bbdb274f8fe4d870 Mon Sep 17 00:00:00 2001 From: QIU Date: Fri, 14 Aug 2026 12:57:37 +0000 Subject: [PATCH] fix(radar): SwipeDeleteRow missing key() deletes wrong QSO Without key(entry.id), Compose reuses component state by position. When the list reorders mid-countdown (new QSO inserted at index 0, or QRZ grid backfill triggers refreshTick++), the pending deletion transfers to a different record and removes the wrong one. Affected screens: LogTab and WavelogLogScreen. --- .../java/com/rtbishop/look4sat/feature/radar/LogTab.kt | 7 +++++++ .../rtbishop/look4sat/feature/radar/WavelogLogScreen.kt | 3 +++ 2 files changed, 10 insertions(+) diff --git a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/LogTab.kt b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/LogTab.kt index b2137137..31a94f41 100644 --- a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/LogTab.kt +++ b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/LogTab.kt @@ -48,6 +48,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.key import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -201,6 +202,11 @@ fun LogTab( modifier = Modifier.padding(horizontal = 10.dp, vertical = 4.dp) ) groupEntries.forEach { entry -> + // key() ties the row's swipe/countdown state to the QSO id. Without it + // Compose reuses state by position, so a list reorder mid-countdown + // (a new QSO is inserted at index 0) moves the pending deletion onto a + // different record and deletes the wrong one. + key(entry.id) { SwipeDeleteRow( onDelete = { queue.remove(entry.id) @@ -234,6 +240,7 @@ fun LogTab( ) } } + } // key(entry.id) } } } diff --git a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/WavelogLogScreen.kt b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/WavelogLogScreen.kt index 92ea90be..a45a1982 100644 --- a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/WavelogLogScreen.kt +++ b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/WavelogLogScreen.kt @@ -25,6 +25,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.key import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -116,6 +117,7 @@ fun WavelogLogScreen( // Rule between groups (md --- effect) HorizontalDivider(thickness = 1.5.dp, color = GridLineColor) groupEntries.forEach { entry -> + key(entry.id) { SwipeDeleteRow( onDelete = { queue.remove(entry.id) @@ -153,6 +155,7 @@ fun WavelogLogScreen( } } } + } // key(entry.id) } } }