LazyColumn уведомляет об изменении элемента
У меня есть составная функция, которая выглядит примерно так:
@Composable
fun listScreen(context: Context, owner: ViewModelStoreOwner) {
val repository = xRepository(getAppDatabase(context).xDao()
val listData by repository.readAllData.observeAsState(emptyList())
// repository.readAllData returns LiveData<List<xEntity>>
// listData is a List<xEntity>
LazyColumn(){
items(listData.size) {
Card {
TextField(listData[it].name)
TextField(listData[it].hoursLeft.toString())
Button(onClick = {updateInDatabase(owner, name = listData[it], hoursLeft = 12)}) {...}
}
}
}
}
fun updateInDatabase(owner: ViewModelStoreOwner, name: String, hoursLeft: Int) {
val xViewModel....
val newEntity = xEntity(name=name, hoursLeft = Int)
xViewModel.update(newEntity)
}
и, как вы, вероятно, догадались, LazyColumn не обновляется после модификации объекта. Есть ли способ обновлять listData после каждого обновления объекта?
2 ответа
я используюmutableStateOf
для переноса полей, которые необходимо перекомпоновать. Такой как
class TestColumnEntity(
val id: String,
title: String = ""
){
var title: String by mutableStateOf(title)
}
Вид:
setContent {
val mData = mutableStateListOf(
TestColumnEntity("id_0").apply { title = "cnm"},
TestColumnEntity("id_1").apply { title = "cnm"},
TestColumnEntity("id_2").apply { title = "cnm"},
TestColumnEntity("id_3").apply { title = "cnm"},
TestColumnEntity("id_4").apply { title = "cnm"},
TestColumnEntity("id_5").apply { title = "cnm"},
)
Column {
Button(onClick = {
mData.add(TestColumnEntity("id_${Random.nextInt(100) + 6}").apply { title = "ccnm" })
}) {
Text(text = "add data")
}
Button(onClick = {
mData[1].title = "test_${Random.nextInt(100)}"
}) {
Text(text = "update data")
}
TestLazyColumn(data = mData, key = {index, item ->
item.id
}) {
Text(text = it.title)
}
}
}
Это работает в моем тестовом примере
Если вы хотите обновить ленивый столбец (скажем, перекомпоновать в Jetpack Compose), используйте побочные эффекты. Поместите функцию получения списка в побочный эффект (эффект запуска или другие побочные эффекты), когда список является побочным эффектом изменения, автоматически перекомпонуйте вашу функцию и покажите обновленный список.