Arjan van Wieringen
06/03/2023, 5:49 AM@Composable
fun rememberAccordeonState(items: List<AccordeonState.Item>): AccordeonState {
val state = remember(items) { AccordeonState(items) }
return state
}
@Composable
fun Accordeon(
items: List<AccordeonState.Item>
) {
val state = rememberAccordeonState(items)
Accordeon(state)
}
fun Accordeon(state: AccordeonState) {
Column(
modifier = Modifier
.fillMaxSize()
.border(1.dp, color = Color.LightGray)
) {
state.items.value.forEachIndexed { index, item ->
AccordeonItem(
header = item.header,
opened = item.opened,
content = item.content,
onClick = { state.open(index) }
)
}
}
}
AccordeonState
contains a State<PersistentList<AccordeonState.Item>
This works great. However, I wanted to easy the creation of the List
via a builder. See 🧵Arjan van Wieringen
06/03/2023, 5:50 AMclass AccordeonStateBuilder {
private var items = persistentListOf<AccordeonState.Item>()
fun item(header: String, content: @Composable () -> Unit) {
items = items.add(AccordeonState.Item(header, content = content))
}
@Composable
fun build(): AccordeonState {
return rememberAccordeonState(items)
}
}
@Composable
fun Accordeon(builder: AccordeonStateBuilder.() -> Unit) {
val stateBuilder = AccordeonStateBuilder()
stateBuilder.builder()
Accordeon(stateBuilder.build())
}
So now I can do this:
Accordeon {
item("History") {
HistoryPanel()
}
item("Entities") {
ProcessTree()
}
}
Arjan van Wieringen
06/03/2023, 5:52 AM