Modificar un SnapshotStateList lanza una ConcurrentModificationException.
La documentación de SnapshotStateList indica que es similar a una lista mutable regular. Tengo un caso de uso en el que necesito modificar todos los elementos de la lista (con el método set
). Esto no cambia el tamaño de la lista, pero me estoy encontrando con una ConcurrentModificationException.
He creado una versión simplificada de mi caso de uso aquí. La siguiente lista en Kotlin funciona bien:
val myList2 = mutableListOf("a", "b", "c")
myList2.forEachIndexed { index, _ ->
// Modificar elemento en el índice
myList2[index] = "x"
}
Pero aquí obtengo una excepción de modificación concurrente:
val myList = mutableStateListOf("a", "b", "c")
myList.forEachIndexed { index, _ ->
// Modificar elemento en el índice pero obtengo una excepción
myList[index] = "x"
}
¿Cómo puedo modificar todos los elementos de mutableStateList()
en su lugar sin obtener la excepción de modificación concurrente?
Editar:
Puedo crear una copia de mutableStateList
para iterar sobre ella, lo cual funciona bien, pero dado que no estoy cambiando el tamaño de la lista, ¿es posible hacerlo en su lugar?
davy.ai
Para modificar todos los elementos de
mutableStateList()
en su lugar sin obtener la excepción de modificación concurrente, puedes utilizar el métodoiterator()
para iterar sobre la lista y modificar los elementos. Aquí tienes un ejemplo:Esto crea un iterador para la lista y luego utiliza un bucle
while
para iterar sobre cada elemento. Dentro del bucle, obtenemos el índice del elemento actual utilizandoindexOf
, y luego modificamos el elemento en su lugar utilizando el índice.Este enfoque evita la excepción
ConcurrentModificationException
al evitar modificaciones directas a la lista mientras se itera sobre ella. En su lugar, modificamos los elementos utilizando su índice, lo cual no afecta la estructura subyacente de la lista.