Hitanshu Dhawan
10/25/2020, 2:03 AMvar
).
If I remove an item, then there is recomposition happening. How to handle such cases in compose?
ViewModel
class MenuViewModel : ViewModel() {
private val data = MenuRepository.getMenuData()
private val _menuItems = MutableLiveData(data.menuItems)
val menuItems: LiveData<List<MenuItem>> = _menuItems
fun incrementMenuItem(menuItem: MenuItem) {
_menuItems.value = _menuItems.value!!.apply { find { it == menuItem }!!.quantity++ }
}
}
In Composable function
val menuItems by viewModel.menuItems.observeAsState()
LazyColumnFor(
items = menuItems!!
) { menuItem ->
MenuItem(
menuItem = menuItem,
onIncrement = { viewModel.incrementMenuItem(menuItem) },
onDecrement = { viewModel.decrementMenuItem(menuItem) },
modifier = Modifier.padding(16.dp)
)
}
mannodermaus
10/25/2020, 7:41 AMHitanshu Dhawan
10/25/2020, 10:18 AMfun incrementMenuItem(menuItem: MenuItem) {
val index = _menuItems.value!!.indexOf(menuItem)
val newMenuItem = menuItem.copy()
newMenuItem.quantity++
_menuItems.value = _menuItems.value!!.toMutableList().also { it[index] = newMenuItem }
}
But, can’t we have a better solution for this? If the data is deeply nested then it will be super hard to make these new objects.
Is there a better way for this?Grigorii Yurkov
10/25/2020, 6:12 PMState
directly without LiveData
Hitanshu Dhawan
10/25/2020, 6:41 PMGrigorii Yurkov
10/25/2020, 7:10 PMmutableStateListOf()
?Hitanshu Dhawan
10/27/2020, 2:42 PMmutableStateListOf
as well, but that also did not work.
var menuItemsState = mutableStateListOf<MenuItem>(*data.menuItems.toTypedArray())
menuItemsState = menuItemsState.also { it.find { it == menuItem }!!.quantity++ }