我遵循了 Litho 指南上的复选框示例,并为单选按钮构建了一个类似的实现:
@LayoutSpec
object CRadioSpec {
@OnCreateLayout
fun onCreateLayout(
c: ComponentContext,
@Prop value: String,
@State isChecked: Boolean
): Component? {
return Column.create(c)
.alignContent(YogaAlign.CENTER)
.widthDip(20F)
.child(
Image.create(c)
.drawableRes(
if (isChecked) R.drawable.ic_checkbox_on
else R.drawable.ic_checkbox_off)
.clickHandler(CRadio.onCheckboxClicked(c))
)
.child(
Text.create(c)
.alignment(TextAlignment.CENTER)
.alignSelf(YogaAlign.CENTER)
.widthDip(20F)
.text(value)
.build()
)
.build()
}
@OnCreateInitialState
fun onCreateInitialState(
c: ComponentContext?,
isChecked: StateValue<Boolean?>,
@Prop initChecked: Boolean
) {
isChecked.set(initChecked)
}
@OnUpdateState
fun updateCheckboxState(isChecked: StateValue<Boolean?>) {
isChecked.get()?.let {
isChecked.set(it.not())
}
}
@OnUpdateState
fun updateCheckbox(isChecked: StateValue<Boolean?>) {
isChecked.get()?.let {
isChecked.set(it.not())
}
}
@OnEvent(ClickEvent::class)
fun onCheckboxClicked(c: ComponentContext?) {
CRadio.updateCheckbox(c)
}
}
但是我相信这将被包裹在一个父级中,以便获得多个单选框,并且必须从父级管理状态。正如文档中提到的:
让我们以单选按钮列表为例,您不能同时检查多个项目。所有单选按钮的状态取决于是否单击和检查了其他项目。与其让所有单选按钮成为有状态的,不如保持在父项中单击的项目的状态,并通过道具自上而下将该信息传播给子项。
我做了很多搜索,但我找不到任何相关的东西。我还检查了 Spinner 组件的实现,但无法得到一个好的实现。如果我可以指导一个具体的例子,那将是一个很大的帮助?