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.ui.platform.LocalContext
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.key
|
||||||
import androidx.compose.runtime.mutableIntStateOf
|
import androidx.compose.runtime.mutableIntStateOf
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
@@ -201,6 +202,11 @@ fun LogTab(
|
|||||||
modifier = Modifier.padding(horizontal = 10.dp, vertical = 4.dp)
|
modifier = Modifier.padding(horizontal = 10.dp, vertical = 4.dp)
|
||||||
)
|
)
|
||||||
groupEntries.forEach { entry ->
|
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(
|
SwipeDeleteRow(
|
||||||
onDelete = {
|
onDelete = {
|
||||||
queue.remove(entry.id)
|
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.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.key
|
||||||
import androidx.compose.runtime.mutableIntStateOf
|
import androidx.compose.runtime.mutableIntStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
@@ -116,6 +117,7 @@ fun WavelogLogScreen(
|
|||||||
// Rule between groups (md --- effect)
|
// Rule between groups (md --- effect)
|
||||||
HorizontalDivider(thickness = 1.5.dp, color = GridLineColor)
|
HorizontalDivider(thickness = 1.5.dp, color = GridLineColor)
|
||||||
groupEntries.forEach { entry ->
|
groupEntries.forEach { entry ->
|
||||||
|
key(entry.id) {
|
||||||
SwipeDeleteRow(
|
SwipeDeleteRow(
|
||||||
onDelete = {
|
onDelete = {
|
||||||
queue.remove(entry.id)
|
queue.remove(entry.id)
|
||||||
@@ -153,6 +155,7 @@ fun WavelogLogScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} // key(entry.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user