Implementation

Creating a Settings UI#

Providers can expose a custom settings screen that the host app shows when the user opens your provider.

Overview#

In the capability-first SDK, settings UI lives on the plugin entry class:

class TestProviderPlugin : ProviderPlugin() {
    @Composable
    override fun SettingsScreen() {
        // Your settings UI here
    }
}

Use settings: ProviderSettings to persist provider configuration.

manifest and settings are assigned by the host at runtime. Don’t access them in init {} blocks or property initializers unless you use by lazy { ... }.

Basic usage#

This example uses Material 3 components and stores values into ProviderSettings.

private const val KEY_HD_ENABLED = "hd_enabled"
private const val KEY_API_KEY = "api_key"
 
@Composable
override fun SettingsScreen() {
    var isHdEnabled by remember {
        mutableStateOf(settings.getBool(KEY_HD_ENABLED, false))
    }
 
    var apiKey by remember {
        mutableStateOf(settings.getString(KEY_API_KEY, "") ?: "")
    }
 
    Column(
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp)
    ) {
        Row(
            modifier = Modifier.fillMaxWidth(),
            verticalAlignment = Alignment.CenterVertically,
        ) {
            Text(
                text = "Enable HD quality",
                modifier = Modifier.weight(1f),
            )
 
            Switch(
                checked = isHdEnabled,
                onCheckedChange = { newValue ->
                    isHdEnabled = newValue
                    settings.setBool(KEY_HD_ENABLED, newValue)
                },
            )
        }
 
        Spacer(Modifier.height(16.dp))
 
        OutlinedTextField(
            value = apiKey,
            onValueChange = { newValue ->
                apiKey = newValue
                settings.setString(KEY_API_KEY, newValue)
            },
            label = { Text("API key") },
            modifier = Modifier.fillMaxWidth(),
        )
    }
}

Supported data types#

ProviderSettings supports primitives and JSON-serializable objects.

// Boolean
settings.getBool("feature_enabled", false)
settings.setBool("feature_enabled", true)
 
// Numbers
settings.getInt("max_quality", 1080)
settings.setFloat("playback_speed", 1.5f)
settings.setLong("timestamp", System.currentTimeMillis())
 
// Strings
settings.getString("username", "default")
settings.setString("server_url", "https://api.example.com")
 
// Custom objects (must be Kotlinx-Serializable)
@Serializable
data class ServerConfig(val url: String, val port: Int)
 
settings.setObject("server_config", ServerConfig("localhost", 8080))
val config = settings.getObject<ServerConfig>("server_config")
 
// Unknown type helpers
settings.getUnknown("username", 1) // Int default
settings.setUnknown("message", "Hello World!")

Additional helpers#

  • settings.exists("key")
  • settings.remove("key")
  • settings.toggleBool("feature_flag", false)
  • settings.resetSettings()
  • settings.allKeys

For more information, see the API reference: