Issue
So, I have a mutableStateListOf in viewModel:
var childTravellersList = mutableStateListOf<TravellersDetails>()
TravellersDetails is a data class having a field called error.
this childTravellersList is used in the UI as:
val list = remember{viewModel.childTravellersList}
LazyColumn(state = lazyColumnState) {
itemsIndexed(list) { index, item ->
SomeBox(show = if(item.error) true else false)
}
}
I have wrote a function in viewModel that updates error of TravellersDetails at given index of childTravellersList as:
fun update(index){
childTravellersList[index].error = true
}
So, whenever I call this function, the list should get updated.
This updates the list, but UI recomposition is not triggered 😕. Where am I doing wrong?
Solution
mutableStateListOf can only notify about adding/removing/replacing some element in the list. When you change any class inside the list, the mutable state cannot know about it.
Data classes are very good for storing immutable state in unidirectional data flow, because you can always "change" it with copy, while you see the need to pass the new data to view or mutable state. So avoid using var variables with data classes, always declare them as val to prevent such errors.
var childTravellersList = mutableStateListOf<TravellersDetails>()
fun update(index){
childTravellersList[index] = childTravellersList[index].copy(error = true)
}
An other problem is that you're using val list = remember{viewModel.childTravellersList}: it saves the first list value and prevents updates in future. With ViewModel you can use it directly itemsIndexed(viewModel.childTravellersList)
Answered By - Phil Dukhov
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.