Overlays
CircuitX provides a few out-of-the-box Overlay
implementations that you can use to build common
UIs.
dependencies {
implementation("com.slack.circuit:circuitx-overlays:<version>")
}
BottomSheetOverlay
¶
BottomSheetOverlay
is an overlay that shows a bottom sheet with a strongly-typed API for the input
model to the sheet content and result type. This allows you to easily use a bottom sheet to prompt
for user input and suspend the underlying Circuit content until that result is returned.
/** A hypothetical bottom sheet of available actions when long-pressing a list item. */
suspend fun OverlayHost.showLongPressActionsSheet(): Action {
return show(
BottomSheetOverlay(
model = listOfActions()
) { actions, overlayNavigator ->
ActionsSheet(
actions,
overlayNavigator::finish // Finish the overlay with the clicked Action
)
}
)
}
@Composable
fun ActionsSheet(actions: List<Action>, onActionClicked: (Action) -> Unit) {
Column {
actions.forEach { action ->
TextButton(onClick = { onActionClicked(action) }) {
Text(action.title)
}
}
}
}
Dialog Overlays¶
alertDialogOverlay
is function that returns an Overlay that shows a simple confirmation dialog with configurable inputs. This acts more or less as an Overlay
shim over the Material 3 AlertDialog
API.
/** A hypothetical confirmation dialog. */
suspend fun OverlayHost.showConfirmationDialog(): Action {
return show(
alertDialogOverlay(
titleText = { Text("Are you sure?") },
confirmButton = { onClick -> Button(onClick = onClick) { Text("Yes") } },
dismissButton = { onClick -> Button(onClick = onClick) { Text("No") } },
)
)
}
There are also more generic BasicAlertDialog
and BasicDialog
implementations that allow more customization.
FullScreenOverlay
¶
Sometimes it’s useful to have a full-screen overlay that can be used to show a screen in full above
the current content. This API is fairly simple to use and just takes a Screen
input of what
content you want to show in the overlay.
overlayHost.showFullScreenOverlay(
ImageViewerScreen(id = url, url = url, placeholderKey = name)
)
When to use FullScreenOverlay
vs navigating to a Screen
?
While they achieve similar results, the key difference is that FullScreenOverlay
is
inherently an ephemeral UI that is controlled by an underlying primary UI. It cannot
navigate elsewhere and it does not participate in the backstack.