Я работаю над приложением JetPack Compose, где пользователи могут динамически добавлять и удалять адреса. Я использую Lazycolumn с уникальным ключом (Address.id), но адреса иногда дублируются вместо замены пустого заполнителя. Итак, ранее моя Lazycolumn приняла индекс в качестве ключа, но переоборудование не было сделано, поэтому я использовал идентификатор адреса Intead. Теперь он показывает дубликат идентификатора. Проблема:
При выборе адреса вместо замены пустого заполнителя появляется дубликатная запись.
Lazycolumn бросает исключение (ключ «0» уже использовался), даже если я гарантирую уникальные идентификаторы. BR /> Список _Addresses в моем просмотре, кажется, содержит дубликаты. < /p>
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
item {
Text(
"Add stops",
style = MaterialTheme.typography.titleMedium,
modifier = Modifier.padding(16.dp)
)
}
itemsIndexed(
items = addresses,
key = { index, address -> address.id } // using unique ID as key
) { index, address ->
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier
.padding(vertical = 8.dp)
.fillMaxWidth()
) {
Text(
text = (index + 1).toString(),
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.padding(end = 8.dp)
)
AddressSearchBox(index, address.address, viewModel)
IconButton(
onClick = {
Log.d("RemoveAddress", "Removing address with ID: ${address.id}")
viewModel.removeAddress(address.id)
},
modifier = Modifier.padding(start = 8.dp)
) {
Icon(
Icons.Default.Close,
contentDescription = "Delete Address",
tint = MaterialTheme.colorScheme.error
)
}
}
}
item {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
horizontalArrangement = Arrangement.Center
) {
TextButton(onClick = { viewModel.addAddress() }) {
Icon(Icons.Default.Add, contentDescription = "Add stop")
Text("Add stop")
}
}
}
item {
Button(
onClick = { },
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
) {
Text("Done")
}
}
}
}
< /code>
@HiltViewModel
class HomeViewModel @Inject constructor(
private val addressRepository: AddressRepository,
private val placesRepository: PlacesRepository,
private val latLongRepository: LatLongRepository
): ViewModel() {
val suggestions = mutableStateOf(emptyList())
var activeIndex: Int? = null
private val addressesMutex = Mutex()
private val _addresses = MutableStateFlow(emptyList())
val addresses: StateFlow = _addresses
fun addAddress() {
_addresses.value += Address(address = "")
}
fun removeAddress(id: Long) {
Log.d("RemoveAddress", "Removing address with ID: $id")
_addresses.value = _addresses.value.filter { it.id != id }
UnmarkSelected(id)
}
fun selectOrAddAddress(address: String) = viewModelScope.launch {
addressesMutex.withLock{
val existingAddress = addressRepository.getAddressIfExists(address)
if (existingAddress != null) {
addressRepository.markAddressSelected(existingAddress.id)
} else {
val latLng = fetchLatLong(address)
latLng?.let {
val newAddress = Address(address = address, latitude = it.latitude, longitude = it.longitude)
val insertedId = addressRepository.insertAddress(newAddress)
addressRepository.markAddressSelected(insertedId)
val updatedList = _addresses.value.toMutableList()
val placeholderIndex = updatedList.indexOfFirst { it.id.toInt() == 0 && it.address.isEmpty() }
if (placeholderIndex != -1) {
updatedList[placeholderIndex] = newAddress.copy(id = insertedId)
} else {
updatedList.add(newAddress.copy(id = insertedId))
}
_addresses.value = updatedList
}
}
}
}
< /code>
Ensured _addresses does not contain duplicates before updating
Expected: No duplicate addresses should appear in LazyColumn.
Result: Duplicates still appeared, even though logs showed _addresses updating correctly.
Used distinctBy { it.address } in LazyColumn
Expected: Prevent duplicate UI elements when the same address is added multiple times.
Result: The issue persisted, and some addresses were still duplicated.
Подробнее здесь: https://stackoverflow.com/questions/794 ... being-used