当列表数据更改时,jetpack compose 中的 LazyColumn 不会重新组合,但 forloop over data list 有效,我不明白为什么以及发生了什么

LazyColumn in jetpack compose does not recompose when list data changes, but forloop over data list works, I am not getting why and what is happening

提问人:Lokesh Chennamchetty 提问时间:10/5/2023 最后编辑:Lokesh Chennamchetty 更新时间:10/5/2023 访问量:122

问:

我正在使用 jetpack compose 开发一个应用程序,我是这个 UI 框架的新手, 我想显示类别 amountSpent 属性。 我正在更改对话框中的花费金额,并希望反映列表中的更改,这里的问题是懒惰列不会重新组合,但类别中的文本可以循环工作。 我不确定为什么 Lazy Column 不起作用,但简单的 forloop 正在工作

          var categories = remember {
            mutableStateListOf(
              Category.FoodCategory(amountSpent=100),
              Category.ShoppingCategory(amountSpent=50),
              Category.TransportationCategory(amountSpent=80),
              Category.EducationCategory(amountSpent=90)
            )
          }

categories[0].amountSpent=400
@Composable
fun HomeUi(categories: SnapshotStateList<Category>) {
         
LazyColumn() {
items(categories){
  Text(text = it.amountSpent.toString())
   }
}
categories.forEach{
  Text(text = it.amountSpent.toString())
}
}

我原以为 Lazy Column 和 ForEach 世界的结果是一样的,但令我震惊的是,Lazy Column 不起作用

The Output was
Before 
100
50
90
80
100
50
90
80

After Change
100
50
90
80
400
50
90
80

类别代码:

sealed class Category(
  val name: String,
  val totalBudget:Int,
  open var amountSpent: Int,
  @DrawableRes val icon : Int){
  data class FoodCategory(override var amountSpent: Int=0):
    Category("Food",500,amountSpent,R.drawable.ic_food)
  class ShoppingCategory(override var amountSpent: Int=0):
    Category("Shopping",500,0,R.drawable.ic_shopping)
  class TransportationCategory(override var amountSpent: Int=0):
    Category("Transportation",500,amountSpent,R.drawable.ic_transportation)
  class EducationCategory(override var amountSpent: Int=0):
    Category("Education",500,amountSpent,R.drawable.ic_education)

}

编辑修复了问题: 我不得不删除类别表单列表并再次添加它,以便重新编译惰性列,为其分配值不起作用,

请谁能解释一下这是 Jetpack compose 的错误还是我这边的问题?

var categoryChanged = categories.find { cat == it.name }
                  categoryChanged?.amountSpent = categoryChanged?.amountSpent?.plus(400)!!
                  var ind = categories.indexOf(categoryChanged)
                  categories.remove(categoryChanged)
                  categories.add(ind, categoryChanged!!)

人造人 android-jetpack-compose lazycolumn 可变状态 状态列表

评论

0赞 Rasul 10/5/2023
可以共享代码Category
0赞 Lokesh Chennamchetty 10/5/2023
@Rasul我更新了类别代码

答:

0赞 Dafi 10/5/2023 #1

如果您需要更改列表中的项目位置或更新值,并且想要在 中重构,则必须添加 。LazyColumnkey

LazyColumn {
    items(
        items = messages,
        key = { message ->
            // Return a stable + unique key for the item
            message.id
        }
    ) { message ->
        MessageRow(message)
    }
}

评论

0赞 Lokesh Chennamchetty 10/9/2023
请查看我对问题的更新编辑。我修复了它,但想知道您是否对修复有任何反馈