【问题标题】:Item index inside rememberDismissState not being updated on list update in LazyColumn itemsIndexedrememberDismissState 中的项目索引未在 LazyColumn itemsIndexed 中的列表更新中更新
【发布时间】:2023-02-05 22:53:25
【问题描述】:

我有一个 LazyColumn,其中有些项目您只能删除列表中的第一项(索引 0)。

LazyColumn 看起来像这样:

LazyColumn {
    itemsIndexed(items, key = { _, item -> item.id }) { index, item ->
        val dismissState = rememberDismissState(DismissValue.Default) { dismissValue ->
            if (index != 0 && dismissValue == DismissValue.DismissedToEnd) {
                someOtherStuff()
                false
            } else true
        }
        if (dismissState.isDismissed(DismissDirection.StartToEnd)) {
            delete(item)
        }
        MyItem(dismissState)
    }
}

delete() 的操作相当无关紧要,您只需要知道它从房间数据库表中删除了列表项,ViewModel 会观察到这一点,从而使 items 缩小一个元素。

但是,问题是 rememberDismissState 中的 index(和 lastIndex)与 itemsIndexed 的实际索引不是最新的。如果我删除 3 个项目列表中的第一个项目,我将无法在两个项目的结果列表中再次删除第一个项目,因为新的第一个项目的索引仍然是 1(或者 @ 987654330@认为)。

我知道这很可能与列表更改时未重新计算的 rememberDismissState 有关,那么我该怎么做呢?解决方法是在将列表放入 itemsIndexed 之前将列表映射到索引,但是有什么方法可以使上面的代码“正常工作”吗?

【问题讨论】:

    标签: android kotlin android-jetpack-compose kotlin-flow android-jetpack-compose-list


    【解决方案1】:

    几个月后回到这个问题后,itemsIndexed 中的这个更改似乎对我有用:

    key = { index, item -> "${item.id}_$index" }
    

    似乎 compose 对纯数字键有一些问题(以前我使用 item.id,它是在数据库中创建新项目时自动递增的 int)。

    但是,这只是部分解决了我的问题,因为我还想检查最后一个索引项目并使其也可删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2012-10-03
      相关资源
      最近更新 更多