La documentación de SnapshotStateList establece que es similar a una lista mutable regular. Tengo un caso de uso en el que necesito modificar todos los elementos de la lista ( set case ). Esto no cambia el tamaño de la lista, pero me encuentro con ConcurrentModificationException.
He creado una versión muy simplificada de mi caso de uso aquí. La siguiente lista de kotlin funciona bien:
val myList2 = mutableListOf("a", "b", "c") myList2.forEachIndexed { index, _ -> // Modify item at index myList2[index] = "x" }Pero obtengo una excepción de modificación concurrente aquí:
val myList = mutableStateListOf("a", "b", "c") myList.forEachIndexed { index, _ -> // Modify item at index but I get an exception myList[index] = "x" } ¿Cómo puedo modificar todos los elementos de mutableStateList() en su lugar sin obtener la excepción de modificación simultánea?
Editar:
Puedo crear una copia de mutableStateList para iterar sobre cuál funciona bien, pero dado que no estoy cambiando el tamaño de la lista, ¿es posible hacerlo en su lugar?
Algunas posibles soluciones son usar replaceAll para transformar la lista en el lugar (siempre y cuando no necesite el índice), o simplemente usar un bucle antiguo sobre los índices si lo necesita.
val listA = mutableListOf("A","B","C") // this works listA.forEachIndexed { i, s -> listA[i] = s.lowercase() } val listB = mutableStateListOf("A","B","C") // this fails - as you noted listB.forEachIndexed { i, s -> listB[i] = s.lowercase() } // this works, as long as you don't need the index listB.replaceAll { s -> s.lowercase() } // this also works, and lets you have the index for(i in listB.indices) { listB[i] = listB[i].lowercase() }