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:
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user