net.zagart.design:builder — Declarative screen builder DSL and BDUI framework
| Module | Artifact | Targets |
|---|---|---|
:builder | net.zagart.design:builder | Android, JVM, iOS |
commonMain.dependencies {
implementation("net.zagart.design:builder:1.6.15")
}
class MyController : ScreenController {
private val _state = MutableStateFlow(buildInitialState())
override val state: StateFlow<ScreenState> = _state
override val isNavigationBarVisible = MutableStateFlow(true)
private fun buildInitialState(): ScreenState = screen {
header { title("My Screen"); search() }
section { item("opt_a", "Option A"); toggle("feature_x", "Enable X") }
lane { media("m1", "Item 1"); media("m2", "Item 2") }
choice { option("sort_date", "Sort by date"); option("sort_name", "Sort by name") }
filter { option("cat_a", "Cat A"); option("cat_b", "Cat B") }
}
override fun onClick(id: String) { /* handle click */ }
override fun onSearch(query: String) { /* filter results */ }
override fun onRefresh() { _state.value = loading { message("Refreshing...") } }
override fun onBack() { }
override fun onLoadMore() { }
override fun onResume() { }
override fun isChecked(id: String) = false
override fun isSelected(id: String) = false
override fun isFiltered(id: String) = false
override fun filter(filterId: String, optionId: String) { }
override fun map(itemId: String) { }
override fun registerLazyLoader(componentId: String, loader: () -> Unit) { }
}
Render with ScreenComposable inside DesignTheme:
DesignTheme(settings) {
ScreenComposable(controller = myController)
}
For stateless usage with explicit callbacks, use ScreenComposableUi.
| Feature | Details |
|---|---|
| ScreenController pattern | Separates UI rendering from state management via the ScreenController interface; controller owns StateFlow<ScreenState> |
| Declarative DSL | Build ScreenState.Content with screen { ... } including header, section, lane, choice, filter, text, title, media components |
| State management | Immutable state with three sealed variants: Content, Loading (optional message), Error (message + retry) |
| BDUI support | Backend-driven UI via LazyComponent with on-demand loading through registerLazyLoader |
| Preview support | PreviewScreenComposable allows defining screen content inline for IDE previews |
version in builder/build.gradle.kts./gradlew :builder:publishAllPublicationsToLocalRepositorygit tag v1.0.0 && git push origin v1.0.0