LazyColumn 通知项目的修改

Posted

技术标签:

【中文标题】LazyColumn 通知项目的修改【英文标题】:LazyColumn notify about modification of item 【发布时间】: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的值 【参考方案1】:

如果您想更新惰性列(比如在 jetpack compose 中重新组合),请使用副作用。 当列表更改副作用时,将列表获取功能置于副作用(启动效果或其他副作用)中,自动重组您的功能并显示更新的列表。

【讨论】:

以上是关于LazyColumn 通知项目的修改的主要内容,如果未能解决你的问题,请参考以下文章

LazyColumn 项目互斥

动画 LazyColumn 项目组成 [重复]

LazyColumn - 项目关键参数用途?

卡中带有标题项目和卡中剩余项目的 LazyColumn

Element中(Notification)通知组件字体修改(Vue项目中Element的Notification修改字体)

Compose:LazyColumn 在单个项目更新时重新组合所有项目