我创建了一个多选列表,但问题是它不会立即重新组合(复选标记不会立即显示,我必须向下滚动然后向上滚动才能显示)。以下是我当前的代码:
数据类别:
data class Item(
val obj: SomeObject? = null,
var isSelected: Boolean = false
)
视图模型:
private val _itemsList: MutableStateFlow<MutableList<Item>> = MutableStateFlow(mutableListOf())
val itemsList = _itemsList.asStateFlow()
fun updateSelection(item: Item) {
_itemsList.value.find {
it.obj?.id == item.obj?.id
}?.isSelected = item.isSelected
}
可组合功能:
Row(
modifier = modifier
.fillMaxWidth()
.clickable {
item.isSelected = !item.isSelected
onCheckClicked(item)
}
) {
CheckableCard(
// other unrelated params,
isSelected = item.isSelected,
onCheckClicked = null
)
}
}
@Composable
fun CheckableCard(
// unrelated params,
isSelected: Boolean,
onCheckClicked: ((Boolean) -> Unit)? = null,
) {
val checkedState by remember { mutableStateOf(isSelected) }
Card(
modifier = modifier
.fillMaxWidth()
.wrapContentHeight()
.padding(top = 16.dp),
) {
Row(
modifier = modifier
.padding(8.dp)
) {
// unrelated content
Checkbox(
checked = checkedState,
onCheckedChange = onCheckClicked
)
}
}
}
我在行中添加了onCheckClicked,而不是将其传递给CheckableCard,因为这样,当选中/取消选中项目时,项目的isSelected会正确更新。但是,当我将函数传递给CheckableCard时,情况并非如此(我通过log.D监视行为,当函数传递给CheckableCard时,没有任何更新)
2条答案
按热度按时间oewdyzsn1#
有几件事
1.如果你的行是可点击的,你可以使用修饰符
toggleable
来代替可点击的。这样,你就可以将CheckedChange上的复选框设置为null。1.你不应该在你的checkablecard中有一个状态。你传递的是isSelected。它应该在Checkbox中正确设置
blmhpbnm2#
您对可组合状态的管理错误。