Home > other >  MutableStateFlow not working with MutableList
MutableStateFlow not working with MutableList

Time:01-30

Here is my MutableStateFlow value I try to work with:

val songList: MutableStateFlow<MutableList<Song>> = MutableStateFlow(arrayListOf())

I need to observe changes (after methods like add, removeAt etc.) on my MutableList above but can't achieve that. My guess is since only the elements of the list change instead of the list itself, collect method doesn't get fired.

How can I achieve that using StateFlow if possible? If not, what is the correct way to do it?

Note that I need initial value of arrayListOf(), so LiveData probably won't be enough for me.

CodePudding user response:


Solution:

  1. Create helper extension function:

    fun <T> List<T>.mapButReplace(targetItem: T, newItem: T) = map {
        if (it == targetItem) {
            newItem
        } else {
            it
        }
    }
    
  2. React on action (ex: click event):

     val newStudent = student.copy(isSelected = !student.isSelected)
    
     viewModel.updateStudents(student, newStudent)
    
  3. Handle in ViewModel:

     fun updateStudents(currentStudent: Student, newStudent: Student) {
         val newList = _students.value.mapButReplace(currentStudent, newStudent)
    
         _students.value = newList
     }
    
  •  Tags:  
  • Related