【问题标题】:UI List not updating jetpack compose with mutableList but data updatesUI 列表不更新 jetpack 与 mutableList 组合但数据更新
【发布时间】:2022-01-07 09:56:34
【问题描述】:

为什么我的列表没有更新?我昨天花了一整天,调试和研究,但我找不到任何可以帮助我的东西。 我的片段中有一个伴生对象,最初是一个空的 mutableList:

class MainTillLayoutFragment : Fragment() {
    companion object {
        var mBasket = mutableListOf<Product?>()
    }
...
}

我有一个名为 addToBasket 的方法。它获取“产品”项目作为参数并将其添加到 mBasket:

    private fun addToBasket(product: Product) {
        mBasket.add(product)
        println("PRODUCTS ADDED NEW BASKET IS $mBasket")
    }

然后我有一个可组合函数,它在 items() 函数中使用 mBasket 循环遍历每个产品并在lazyColumn 的每一行中显示一个文本:

 LazyColumn(
     modifier = Modifier
         .background(color = Color.Red)
         .fillMaxSize(),
     content = {
          items(mBasket) {
                if (it != null) {
                     Text(text = it.name)
                      }
                }
         }
   )

数据确实会更新,但是 UI 没有,上面的代码有什么问题我应该尝试一下吗?

提前谢谢大家:)

【问题讨论】:

  • 您需要使用 Compose 自己的状态版本,例如mutableStateOf....更新它将触发重组。
  • @JohnO'Reilly 是的,我刚刚找到了答案!我不得不使用 mutableStateListOf 我认为这就是你的意思,非常感谢你的帮助伙伴!
  • 你也可以在这里使用mutableStateOf,如果你感兴趣的数据已经是一个列表,这通常更合适,例如您可能有一个视图模型来公开它(可能是流程)......在这种情况下,您可能还会使用 collectAsState 之类的东西来转换为状态变量

标签: android kotlin android-jetpack-compose android-livedata


【解决方案1】:

我找到了解决办法 如果有人需要它,不要使用 mutableListOf(),而是尝试使用 mutableStateListOf(),它应该会跟踪状态并自动为您重构视图!

在我的情况下,而不是

    var mBasket = mutableListOf<Product?>()

我应该做的

    var mBasket = mutableStateListOf<Product?>()

【讨论】:

    猜你喜欢
    • 2021-07-18
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2018-01-04
    相关资源
    最近更新 更多