kotlin 多选择列表喷气背包组成

vawmfj5a  于 2023-04-07  发布在  Kotlin
关注(0)|答案(2)|浏览(142)

我创建了一个多选列表,但问题是它不会立即重新组合(复选标记不会立即显示,我必须向下滚动然后向上滚动才能显示)。以下是我当前的代码:
数据类别:

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时,没有任何更新)

oewdyzsn

oewdyzsn1#

有几件事
1.如果你的行是可点击的,你可以使用修饰符toggleable来代替可点击的。这样,你就可以将CheckedChange上的复选框设置为null。

  1. item.isSelected不是一个状态。所以它不会触发一个重组。你的updateSelection只是改变了那个变量,不会更新列表。你可以尝试使用一个MutableStateList,用更新复制列表(可能会很昂贵),或者让isSelected成为一个可变状态(可能不适用于某些架构)
    1.你不应该在你的checkablecard中有一个状态。你传递的是isSelected。它应该在Checkbox中正确设置
@Composable
fun CheckableCard(
    // unrelated params,
    isSelected: Boolean,
) {
    Card(
        modifier = modifier
            .fillMaxWidth()
            .wrapContentHeight()
            .padding(top = 16.dp),
    ) {
        Row(
            modifier = modifier
                .padding(8.dp)
        ) {
            // unrelated content
                
            Checkbox(
                checked = isSelected,
                onCheckedChange = null
            )
        }
    }
}
blmhpbnm

blmhpbnm2#

您对可组合状态的管理错误。

data class Item(
   val obj: SomeObject? = null,
   val isSelected: Boolean = false
)

fun updateSelection(item: Item) {
   _itemsList.value = _itemsList.value?.map {
        if (it.obj?.id == item.obj?.id)
            it.copy(isSelected = !item.isSelected)
        else
            it
    }
}

Row(
    modifier = modifier
        .fillMaxWidth()
        .clickable {
            onCheckClicked(item)
        }
) {
    CheckableCard(
        // other unrelated params,
        isSelected = item.isSelected,
    )
}

@Composable
fun CheckableCard(
    // unrelated params,
    isSelected: Boolean,
) {
    Card(
        modifier = modifier
            .fillMaxWidth()
            .wrapContentHeight()
            .padding(top = 16.dp),
    ) {
        Row(
            modifier = modifier
                .padding(8.dp)
        ) {
            // unrelated content
                
            Checkbox(
                checked = isSelected,
                onCheckedChange = {}
            )
        }
    }
}

相关问题