Build apps faster with over 150+ styled components and screens! Check it out →

Button

Common

Component in Material 3 Compose

Buttons help people initiate actions, from sending an email, to sharing a document, to liking a post.

Filled button
image

Last updated:

Installation

dependencies {
   implementation("androidx.compose.material3:material3:1.4.0-alpha07")
}

Overloads

@Composable
fun Button(
    onClick: () -> Unit,
    modifier: Modifier = Modifier,
    enabled: Boolean = true,
    shape: Shape = ButtonDefaults.shape,
    colors: ButtonColors = ButtonDefaults.buttonColors(),
    elevation: ButtonElevation? = ButtonDefaults.buttonElevation(),
    border: BorderStroke? = null,
    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
    interactionSource: MutableInteractionSource? = null,
    content: @Composable RowScope.() -> Unit
)

Parameters

namedescription
onClickcalled when this button is clicked
modifierthe [Modifier] to be applied to this button
enabledcontrols the enabled state of this button. When false, this component will not respond to user input, and it will appear visually disabled and disabled to accessibility services.
shapedefines the shape of this button's container, border (when [border] is not null), and shadow (when using [elevation])
colors[ButtonColors] that will be used to resolve the colors for this button in different states. See [ButtonDefaults.buttonColors].
elevation[ButtonElevation] used to resolve the elevation for this button in different states. This controls the size of the shadow below the button. See [ButtonElevation.shadowElevation].
borderthe border to draw around the container of this button
contentPaddingthe spacing values to apply internally between the container and the content
interactionSourcean optional hoisted [MutableInteractionSource] for observing and emitting [Interaction]s for this button. You can use this to change the button's appearance or preview the button in different states. Note that if null is provided, interactions will still happen internally.
contentThe content displayed on the button, expected to be text, icon or image.
@Composable
@ExperimentalMaterial3ExpressiveApi
fun Button(
    onClick: () -> Unit,
    shapes: ButtonShapes,
    modifier: Modifier = Modifier,
    enabled: Boolean = true,
    colors: ButtonColors = ButtonDefaults.buttonColors(),
    elevation: ButtonElevation? = ButtonDefaults.buttonElevation(),
    border: BorderStroke? = null,
    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
    interactionSource: MutableInteractionSource? = null,
    content: @Composable RowScope.() -> Unit
)

Parameters

namedescription
onClickcalled when this button is clicked
shapesthe [ButtonShapes] that this button with morph between depending on the user's interaction with the button.
modifierthe [Modifier] to be applied to this button
enabledcontrols the enabled state of this button. When false, this component will not respond to user input, and it will appear visually disabled and disabled to accessibility services.
colors[ButtonColors] that will be used to resolve the colors for this button in different states. See [ButtonDefaults.buttonColors].
elevation[ButtonElevation] used to resolve the elevation for this button in different states. This controls the size of the shadow below the button. See [ButtonElevation.shadowElevation].
borderthe border to draw around the container of this button
contentPaddingthe spacing values to apply internally between the container and the content
interactionSourcean optional hoisted [MutableInteractionSource] for observing and emitting [Interaction]s for this button. You can use this to change the button's appearance or preview the button in different states. Note that if null is provided, interactions will still happen internally.
contentThe content displayed on the button, expected to be text, icon or image.

Code Examples

ButtonSample

@Preview
@Composable
fun ButtonSample() {
    Button(onClick = {}) { Text("Button") }
}

ButtonWithIconSample

@Preview
@Composable
fun ButtonWithIconSample() {
    Button(
        onClick = { /* Do something! */ },
        contentPadding = ButtonDefaults.ButtonWithIconContentPadding
    ) {
        Icon(
            Icons.Filled.Favorite,
            contentDescription = "Localized description",
            modifier = Modifier.size(ButtonDefaults.IconSize)
        )
        Spacer(Modifier.size(ButtonDefaults.IconSpacing))
        Text("Like")
    }
}

SquareButtonSample

@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Preview
@Composable
fun SquareButtonSample() {
    Button(onClick = { /* Do something! */ }, shape = ButtonDefaults.squareShape) { Text("Button") }
}

SmallButtonSample

@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Preview
@Composable
fun SmallButtonSample() {
    Button(
        onClick = { /* Do something! */ },
        contentPadding = ButtonDefaults.SmallButtonContentPadding
    ) {
        Text("Button")
    }
}

XSmallButtonWithIconSample

@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Preview
@Composable
fun XSmallButtonWithIconSample() {
    Button(
        onClick = { /* Do something! */ },
        modifier = Modifier.heightIn(ButtonDefaults.XSmallContainerHeight),
        contentPadding = ButtonDefaults.XSmallContentPadding
    ) {
        Icon(
            Icons.Filled.Edit,
            contentDescription = "Localized description",
            modifier = Modifier.size(ButtonDefaults.XSmallIconSize)
        )
        Spacer(Modifier.size(ButtonDefaults.XSmallIconSpacing))
        Text("Label")
    }
}

MediumButtonWithIconSample

@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Preview
@Composable
fun MediumButtonWithIconSample() {
    Button(
        onClick = { /* Do something! */ },
        modifier = Modifier.heightIn(ButtonDefaults.MediumContainerHeight),
        contentPadding = ButtonDefaults.MediumContentPadding
    ) {
        Icon(
            Icons.Filled.Edit,
            contentDescription = "Localized description",
            modifier = Modifier.size(ButtonDefaults.MediumIconSize)
        )
        Spacer(Modifier.size(ButtonDefaults.MediumIconSpacing))
        Text(text = "Label", style = MaterialTheme.typography.titleMedium)
    }
}

LargeButtonWithIconSample

@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Preview
@Composable
fun LargeButtonWithIconSample() {
    Button(
        onClick = { /* Do something! */ },
        modifier = Modifier.heightIn(ButtonDefaults.LargeContainerHeight),
        contentPadding = ButtonDefaults.LargeContentPadding
    ) {
        Icon(
            Icons.Filled.Edit,
            contentDescription = "Localized description",
            modifier = Modifier.size(ButtonDefaults.LargeIconSize)
        )
        Spacer(Modifier.size(ButtonDefaults.LargeIconSpacing))
        Text(text = "Label", style = MaterialTheme.typography.headlineSmall)
    }
}

XLargeButtonWithIconSample

@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Preview
@Composable
fun XLargeButtonWithIconSample() {
    Button(
        onClick = { /* Do something! */ },
        modifier = Modifier.heightIn(ButtonDefaults.XLargeContainerHeight),
        contentPadding = ButtonDefaults.XLargeContentPadding
    ) {
        Icon(
            Icons.Filled.Edit,
            contentDescription = "Localized description",
            modifier = Modifier.size(ButtonDefaults.XLargeIconSize)
        )
        Spacer(Modifier.size(ButtonDefaults.XLargeIconSpacing))
        Text(text = "Label", style = MaterialTheme.typography.headlineLarge)
    }
}

ButtonWithAnimatedShapeSample

@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Preview
@Composable
fun ButtonWithAnimatedShapeSample() {
    Button(onClick = {}, shapes = ButtonDefaults.shapes()) { Text("Button") }
}
by @alexstyl