正在为我的应用程序进行辅助功能增强。
从Docs中,我可以看到Card
将onClick
和onClickLabel
都作为API的一部分。
对于没有onClick
的可堆肥,我们可以使用Modifier.clickable
或Modifier.semantics
。
但是Button
、IconButton
、FloatingActionButton
、TextButton
和OutlinedButton
呢
将onClick
作为API的一部分但不包含onClickLabel
的组件。
这是意料之中的事。但是这是编写代码的正确方式吗?
IconButton(
onClick = navigateUp,
modifier = Modifier.clickable(
onClickLabel = "Navigate up",
onClick = {},
)
) {
Icon(
imageVector = Icons.Rounded.ArrowBack,
contentDescription = stringResource(
id = R.string.top_app_bar_content_description_navigate_up,
),
)
}
这似乎太令人困惑了,因为IconButton
期望onClick
。所以我不能完全采用Modifier.clickable
或Modifier.semantics
类似地,Modifier.clickable
也期望onClick
。
因此,对于一个可组合的组件,我有两个onClick
,这很容易导致许多难以调试的错误。
更改原因,
阅读"双击"向上导航";而不是默认的";双击以激活";。
p.S:
编写版本-1.0.4
在这种情况下不需要Modifier.clickable
,因为:
- IconButton已经通过其
onClick
lambda处理点击 - CCD_ 23具有用于可访问性的CCD_
所以你只需要这个
IconButton(
onClick = navigateUp,
) {
Icon(
imageVector = Icons.Rounded.ArrowBack,
contentDescription = stringResource(
id = R.string.top_app_bar_content_description_navigate_up,
),
)
}
这似乎不是最漂亮的解决方案,但我最终做了:
IconButton(
modifier = Modifier.size(40.dp).clearAndSetSemantics {
this.onClick(label = closeLabelDescription, action = null)
this.contentDescription = closeDescription
this.role = Role.Button
},
onClick = onClickClose,
) {
Icon(
painter = painterResource(R.drawable.ic_close),
tint = RiotWhite,
contentDescription = null
)
}