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), используйте побочные эффекты. Поместите функцию получения списка в побочный эффект (эффект запуска или другие побочные эффекты), когда список является побочным эффектом изменения, автоматически перекомпонуйте вашу функцию и покажите обновленный список.

Другие вопросы по тегам