Blocks

Profile Settings

A profile screen with an avatar header and grouped account and general settings rows over a bottom nav.

9:41

Profile

Marie T Wiedman

marie@gmail.con

Account Setting

Personal Information
Change Password
Delivery Address

General settings

Synced Calendars
App Settings
Activity
Invite Others

Installation

caveui components are copy-paste Jetpack Compose built entirely on Material 3 — there's no caveui dependency to add. Make sure Material 3 is on your classpath (it ships with the Compose BOM), then copy the Usage snippet below into your project.

kotlin
// build.gradle.kts (module)
dependencies {
    implementation(platform("androidx.compose:compose-bom:2025.06.00"))
    implementation("androidx.compose.material3:material3")
}

Usage

kotlin
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ProfileSettingsScreen(
    name: String,
    email: String,
    account: List<Pair<ImageVector, String>>,
    general: List<Pair<ImageVector, String>>,
) {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text("Profile", fontWeight = FontWeight.Bold) },
                navigationIcon = {
                    IconButton(onClick = {}) {
                        Icon(Icons.AutoMirrored.Filled.ArrowBack, "Back")
                    }
                },
                actions = { IconButton(onClick = {}) { Icon(Icons.Filled.Edit, "Edit") } },
            )
        },
        bottomBar = {
            NavigationBar {
                NavigationBarItem(false, {}, { Icon(Icons.Filled.Home, null) })
                NavigationBarItem(false, {}, { Icon(Icons.Filled.CalendarToday, null) })
                NavigationBarItem(false, {}, { Icon(Icons.AutoMirrored.Filled.List, null) })
                NavigationBarItem(true, {}, { Icon(Icons.Filled.Person, null) })
            }
        },
    ) { padding ->
        Column(
            Modifier.fillMaxSize().padding(padding)
                .verticalScroll(rememberScrollState()).padding(16.dp),
            horizontalAlignment = Alignment.CenterHorizontally,
        ) {
            Surface(shape = CircleShape, color = MaterialTheme.colorScheme.primaryContainer,
                modifier = Modifier.size(64.dp)) {}
            Text(name, Modifier.padding(top = 8.dp),
                style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Bold)
            Text(email, color = MaterialTheme.colorScheme.onSurfaceVariant,
                style = MaterialTheme.typography.labelSmall)
            Text("Account Setting", Modifier.fillMaxWidth().padding(top = 16.dp),
                style = MaterialTheme.typography.titleSmall, fontWeight = FontWeight.Bold)
            account.forEach { (icon, label) ->
                ListItem(
                    leadingContent = { Icon(icon, null) },
                    headlineContent = { Text(label) },
                )
                HorizontalDivider()
            }
            Text("General settings", Modifier.fillMaxWidth().padding(top = 16.dp),
                style = MaterialTheme.typography.titleSmall, fontWeight = FontWeight.Bold)
            general.forEach { (icon, label) ->
                ListItem(
                    leadingContent = { Icon(icon, null) },
                    headlineContent = { Text(label) },
                )
                HorizontalDivider()
            }
        }
    }
}