I need some advice, because I am not sure I am doi...
# compose
a
I need some advice, because I am not sure I am doing this correctly (recomposition wise). I have an Accordeon composable:
Copy code
@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 🧵
Copy code
class 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:
Copy code
Accordeon {
   item("History") {
        HistoryPanel()
    }
   item("Entities") {
       ProcessTree()
   }
}
However, the builder will always be run. I doubt this makes any performance impact, but I was wondering if there is a better way to do this. If I am correct the accordeonState will will only be updated if the items change, so that's good.