Skip to content

Radio 单选框 ​

受控单选框,选中后再次点击不会取消选中(单选语义)。

契约源:lh-ui-core/specs/radio.json · 黄金用例:cases/radio.json(6 条,已翻译为 JVM 单测 + Compose UI Test)

状态与单选组 ​

组件本身不含组逻辑,单选互斥由宿主维护(用 value 标识组内项)。

9:41Radio

HTML 模拟预览(Android / Compose 外观),非真机渲染

kotlin
var selected by remember { mutableStateOf("a") }
listOf("选项一" to "a", "选项二" to "b").forEach { (text, value) ->
  LhRadio(
    checked = selected == value,
    onChange = { selected = value },
    label = text,
    value = value,
  )
}

尺寸 ​

三档圆环尺寸映射到 radio.size.* 令牌;内圆点直径 = 尺寸 × radio.dotScale。

9:41Radio 尺寸

HTML 模拟预览(Android / Compose 外观),非真机渲染

API ​

Props ​

属性说明类型默认值
checked是否选中(必填)Boolean—
onChange由未选中变为选中时触发,携带 checked = true(Boolean) -> Unit—
disabled是否禁用Booleanfalse
label标签文字String?null
value单选值(组内标识,组件本身不含组逻辑)String?null
size圆环尺寸LhRadioSizeMedium
labelContent标签内容(覆盖 label,spec 的 default 插槽)@Composable (() -> Unit)?null
modifier修饰符ModifierModifier

LhRadioSize ​

值尺寸令牌内圆点直径
Smallradio.size.small(16dp)16dp × radio.dotScale(0.5)
Mediumradio.size.medium(20dp)20dp × radio.dotScale
Largeradio.size.large(24dp)24dp × radio.dotScale

点击命中整个行:仅当未选中且未禁用时变为选中并触发 onChange(true)。

令牌对照 ​

令牌用途
radio.size.{small,medium,large}三档圆环尺寸
radio.ringWidth外环描边宽
radio.dotScale内圆点相对外环直径的比例(分数)
radio.gap圆环与标签间距
color.primary.default选中描边与圆点色
color.border.base未选描边色
color.disabled.{border,text}禁用描边 / 圆点 / 文字色
color.text.primary标签色
typography.fontSize.base标签字号

黄金用例对照 ​

case id断言本地测试
tap-unchecked-emits-onchange未选点击触发 onChange(true)LhRadioTest.tap_unchecked_emits_onchange_true(Compose UI Test)
tap-checked-keeps-checked已选点击不触发LhRadioTest.tap_checked_does_not_emit
disabled-blocks-change禁用态不触发LhRadioTest.disabled_blocks_change
checked-uses-primary-tokens选中消费主色令牌LhRadioDefaultsTest.checked_uses_primary_tokens
unchecked-uses-border-token未选消费描边令牌LhRadioDefaultsTest.unchecked_uses_border_token
small-size-uses-small-token小号消费 small 尺寸令牌LhRadioDefaultsTest.small_size_uses_small_token
bash
./gradlew :components:radio:test                              # JVM 部分
./gradlew :components:radio:connectedAndroidTest             # 交互部分(需设备)