Jetpack在ClickLabel上为Button和IconButton组合



正在为我的应用程序进行辅助功能增强。

从Docs中,我可以看到CardonClickonClickLabel都作为API的一部分。

对于没有onClick的可堆肥,我们可以使用Modifier.clickableModifier.semantics

但是ButtonIconButtonFloatingActionButtonTextButtonOutlinedButton
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.clickableModifier.semantics
类似地,Modifier.clickable也期望onClick

因此,对于一个可组合的组件,我有两个onClick,这很容易导致许多难以调试的错误。

更改原因,
阅读"双击"向上导航";而不是默认的";双击以激活";。

p.S:
编写版本-1.0.4

在这种情况下不需要Modifier.clickable,因为:

  • IconButton已经通过其onClicklambda处理点击
  • 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
)
}