【发布时间】:2021-11-07 20:31:06
【问题描述】:
我有一个看起来像这样的可组合函数:
@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 {
Text(listData[it].name)
Text(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?
编辑:
class xRepository(private val xDatabaseDao) {
val readAllData: LiveData<List<xEntity>> = xDatabaseDao.getallXinfo()
...
suspend fun updatePlant(x: xEntity) {
plantzDao.updateX(x)
}
}
interface xDatabaseDao {
@Query("SELECT * FROM xInfo ORDER BY id DESC")
fun getAllXInfo(): LiveData<List<xEntity>>
....
@Update(onConflict = OnConflictStrategy.REPLACE)
suspend fun updateX(x: xEntity?)
}
实体修改:
fun updatePlantInDatabase(owner: ViewModelStoreOwner, name: String, waterAtHour: Int, selectedDays: ArrayList<Int>) {
val xViewModel: xViewModel = ViewModelProvider(owner).get(xViewModel::class.java)
val new = xEntity(name = name, waterAtHour = waterAtHour, selectedDays = selectedDays)
xViewModel.updatePlant(new)
}
【问题讨论】:
-
为什么你的
TextField只有一个参数,是只读的?显示readAllData以及您如何修改数据 -
1.我的错误,没有文本字段,我的意思是文本 2。我将使用有关 readAllData 和修改的信息更新帖子
-
我仍然不知道你的
xViewModel是如何连接到repository.readAllData的,以及为什么它会触发重组 -
基本上我唯一想做的就是在修改其中一个实体后“刷新”包含有关 xEntities 的所有信息的列表
-
从撰写的角度来看你做得很好,看看为什么你的
readAllData在数据库更新后没有更新LiveData的值
标签: android android-room android-jetpack-compose lazycolumn