Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

312
Vistas
Problema de actualización de propiedad de elemento de lista de LiveData/StateFlow de Android

Así que estoy actualizando mi RecylerView con StateFlow<List> como sigue:

Mi clase de datos:

 data class Student(val name: String, var isSelected: Boolean)

Mi lógica ViewModel:

 fun updateStudentsOnSelectionChanged(targetStudent: Student) { val targetIndex = _students.value.indexOf(targetStudent) val isSelected = !targetStudent.isSelected _students.value[targetIndex].isSelected = isSelected //<- doesn't work }

Problema: la interfaz de usuario no cambia, pero isSelected dentro _student cambia, ¿qué está pasando? (igual que LiveData )

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Supongo que _students es StateFlow<List> . Cambiar la propiedad isSelected del modelo Student no StateFlow . La solución sería hacer que la propiedad isSelected de la clase de datos Student sea inmutable para compararla cuando se establece un nuevo estado, crear una MutableList a partir de la lista actual y copiar el objeto Student existente con el nuevo valor para la propiedad isSelected :

 data class Student(val name: String, val isSelected: Boolean) val students = _students.value.toMutableList() students[targetIndex] = students[targetIndex].copy(isSelected = isSelected) _students.value = students
over 4 years ago · Santiago Trujillo Denunciar

0

Ok, gracias a @Tenfour04 y @Sergey, finalmente descubrí que StateFlow/LiveData no puede detectar los cambios internos, eso es porque ambos están comparando la Referencia del .value .

Eso significa que si quiero forzar la actualización de StateFow<List> , la única forma es asignarle una nueva List , por lo tanto, creé la siguiente función de extensión auxiliar:

 fun <T> List<T>.mapButReplace(targetItem: T, newItem: T) = map { if (it == targetItem) { newItem } else { it } } //this function returns a new List with the content I wanted

En Fragment :

 val itemCheckAction: (Student) -> Unit = { student -> val newStudent = student.copy(isSelected = !student.isSelected) //prepare a new Student viewModel.updateStudentsOnSelectionChanged(student, newStudent) //update the StateFlow }

En ViewModel :

 fun updateStudentsOnSelectionChanged(currentStudent: Student, newStudent: Student) { val newList = _students.value.mapButReplace(currentStudent, newStudent) _students.value = newList //assign a new List with different reference }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda