Renderer Patterns
Keep renderers maintainable by splitting registrations per feature.
fun contactsRenderer(): NodeRenderer<ContactsFlowEvent> = nodeRenderer {
registerContactsList()
registerContactDetails()
registerEditContact()
}
private fun NodeRendererBuilder<ContactsFlowEvent>.registerContactsList() =
register<ContactsListNode> { node ->
val state by node.state.collectAsState()
ContactsListScreen(state = state, onEvent = node::onEvent)
}
Tips:
- Always wrap renderer creation in
remember { … }so Compose keeps it stable. - Group registrations by feature to avoid giant lambdas.
- If you need DI/ViewModel access, grab the dependency outside the renderer and pass it to the nodes when building the NavFlow.
- Consider exposing renderer builders per feature module so code is reusable across apps.