Android dev (Kotlin и Jetpack) Lazycolumn Duplicate используется ключAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android dev (Kotlin и Jetpack) Lazycolumn Duplicate используется ключ

Сообщение Anonymous »

Я работаю над приложением 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»