Builder

net.zagart.design:builder — Declarative screen builder DSL and BDUI framework

Module

ModuleArtifactTargets
:buildernet.zagart.design:builderAndroid, JVM, iOS

Installation

commonMain.dependencies {
    implementation("net.zagart.design:builder:1.6.15")
}

Basic Usage

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.

Features

FeatureDetails
ScreenController patternSeparates UI rendering from state management via the ScreenController interface; controller owns StateFlow<ScreenState>
Declarative DSLBuild ScreenState.Content with screen { ... } including header, section, lane, choice, filter, text, title, media components
State managementImmutable state with three sealed variants: Content, Loading (optional message), Error (message + retry)
BDUI supportBackend-driven UI via LazyComponent with on-demand loading through registerLazyLoader
Preview supportPreviewScreenComposable allows defining screen content inline for IDE previews

Versioning & Releases

  1. Update version in builder/build.gradle.kts
  2. Run ./gradlew :builder:publishAllPublicationsToLocalRepository
  3. Tag and push: git tag v1.0.0 && git push origin v1.0.0
  4. Maven Central deployment happens automatically via daily CI
← Back to all libraries