在可变列表中添加项目时不会触发Android Compose Recomposition

yxyvkwin  于 2023-06-04  发布在  Android
关注(0)|答案(1)|浏览(103)

我在LazyColumn中有一个文件列表。用户可以在列表中选择多个文件。我有一个按钮浮动在那个列表上。该按钮的文本是“存档n个文件”(其中n是在列表中选定的文件数)我希望该按钮的文本更改每次文件在列表中选择或取消选择。
我使用包含所选文件的MutableState

selections = rememberSaveable { mutableStateOf(mutableListOf()) }

当用户单击显示列表中的文件时,我会在selections中添加或删除一个条目

if (row.isSelectedState.value) {
            selections.value.add(row.idConversation)
        } else {
            selections.value.remove(row.idConversation)
        }

在按钮文本中使用selections的大小

text =
   if (selections.value.size == 0)
      "Archive"
   else
      String.format("Archive %1$d conversations", selections.value.size)

问题是,当我们在selections中添加或删除项目时,按钮的文本不会改变,基于selections.value.size的重组不会触发。
我通过使用另一个状态修复了此问题

selectionCount = rememberSaveable { mutableStateOf(selections.value.size) }
text =
   if (selectionCount.value == 0)
      "Archive"
   else
      String.format("Archive %1$d conversations", selectionCount.value)

并在每次添加或删除selections中的项时更新此状态

if (row.isSelectedState.value) {
            selections.value.add(row.idConversation)
        } else {
            selections.value.remove(row.idConversation)
        }
        selectionCount.value = selections.value.size

但是我不喜欢这个解决方案,因为我必须维护另一个状态,并且在将来的代码中,当我们在selections中添加或删除项目时,可能会忘记更新它
selections中添加/删除项目后,我可以做些什么来触发按钮的重组?

0h4hbjxa

0h4hbjxa1#

将选择列表创建为

val selections = remember { mutableStateListOf<Selection>()}

创建一个变量来保存大小

var size = 0

LaunchedUnit(key=selections.size){
  size = selections.size  
}

这个LaunchedEffect块将在每次选择时执行。size改变,在任何你想显示它的地方使用size变量。

相关问题