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.
This commit is contained in:
mckero committed 2026-08-14 12:57:37 +00:00
1 parent 77314e824e
commit aedb3fee19
2 files changed
+10

No files matched your search

@@ -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)
}
}
}
@@ -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)
}
}
}