在Compose LazyColumn中选择单项:为何用.selectable而非.clickable?
在Compose LazyColumn中选择单项:.selectable 与 .clickable的区别
我已阅读相关问题,认为Code A与Code B实现的功能几乎一致,想请教在Compose LazyColumn中选择单项时,为何应使用.selectable修饰符而非.clickable?
Code A(使用.clickable)
val items = listOf(Pair("A", 1), Pair("AA", 144), Pair("BA", 99)) var selectedItem by remember { mutableStateOf(items[0]) } LazyColumn { this.items(items = items) { Row(modifier = Modifier.clickable { selectedItem = it }) { if (selectedItem == it) { Text(it.first, color = Color.Red) } else { Text(it.first) } } } }
Code B(使用.selectable)
val items = listOf(Pair("A", 1), Pair("AA", 144), Pair("BA", 99)) var selectedItem by remember { mutableStateOf("") } LazyColumn { this.items(items = items) { Row(modifier = Modifier.selectable( selected = selectedItem == it.first, onClick = { selectedItem = it.first } )) { if (selectedItem == it.first) { Text(it.first, color = Color.Red) } else { Text(it.first) } } } }
为什么优先用.selectable?
无障碍体验更到位
.selectable会自动给组件添加选中状态的无障碍语义,屏幕阅读器能明确告知用户当前哪项被选中;而.clickable仅处理点击事件,没有这类内置语义,视障用户无法感知选中状态。语义更精准,符合交互规范
在Material Design的交互逻辑里,单选项属于“可选择控件”,.selectable的命名和参数设计(比如selected参数)直接传达了“可被选中”的核心语义;而.clickable仅表示“可点击”,无法体现选择类控件的本质,逻辑上不够贴合场景。自带键盘交互支持
使用.selectable的组件,默认支持键盘导航(比如方向键切换)和空格键/回车键触发选中,这是.clickable默认没有的行为,能覆盖更多操作场景,提升桌面端或键盘操作用户的体验。状态与组件绑定更紧密
.selectable直接接收selected状态参数,组件本身就知晓自己的选中状态,和Compose的状态管理体系更契合;而.clickable需要手动在UI层判断状态并修改样式,逻辑上是分离的,代码的可维护性稍差。
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

