Nested popup menus with smooth height animations for Android
cascade-compose:
DropdownMenuHeader()
in root menus.CascadeDropdownMenu()
as an alternative to MaterialTheme.shapes.extraSmall
.8dp
if minSdk >= 31.compose-ui
to 1.5.2.Update compose-ui to 1.5.0-beta02
This release depends on an alpha version of compose-ui
to fix a crash when cascade
is used with androidx.compose.ui:ui:1.5.0-alpha01
or newer versions.
This release promotes 2.0.0-rc02
to stable.
cascade
2.0.0 brings support for Compose UI. As usual, it is offering a a drop-in replacement for Material Design's DropdownMenu() composable with support for nested menus.
- DropdownMenu(
+ CascadeDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
)
See project website for full documentation.
Correctly publish sources
New project website: https://saket.github.io/cascade
Compose UI
0dp
vertical content paddings8dp
)Breaking changes
minSdk = 23
DropdownMenuHeader()
is no longer an extension function.CascadeState#navigateBack()
no longer returns a boolean. You can use CascadeState#isBackStackEmpty()
instead.cascade
is getting ready for Compose UI. As usual, it is offering a a drop-in replacement for Material Design's DropdownMenu()
composable with support for nested menus.
- DropdownMenu(
+ CascadeDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
)
implementation "me.saket.cascade:cascade-compose:2.0.0-beta1"
implementation "androidx.compose.material3:material3:..." // https://developer.android.com/jetpack/androidx/releases/compose-material3
Sample code
var expanded by rememberSaveable { mutableStateOf(false) }
CascadeDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
DropdownMenuItem(
text = { Text("Horizon") },
children = {
DropdownMenuItem(
text = { Text("Zero Dawn") },
onClick = { … }
)
DropdownMenuItem(
text = { Text("Forbidden West") },
onClick = { … }
)
}
)
}
cascade
assumes that they were supplied by appcompat
or MaterialComponents
. If paddings are really desired, a custom CascadePopupMenu.Styler.background
will have to be provided with paddings.// A "back" navigator can be used for setting up a menu's navigation before an instance of
// CascadePopupMenu can be created. This is especially useful for overriding Toolbar's popup
// menus where a CascadePopupMenu can only be created AFTER a menu item is clicked
// (to maintain backwards compatibility with PopupMenu).
val navigator = CascadeBackNavigator()
toolbar.menu.addSubMenu("Are you sure?").apply {
add("Cancel").setOnMenuItemClickListener {
backNavigator.navigateBack()
}
}
toolbar.overrideOverflowMenu { context, anchor ->
CascadePopupMenu(context, anchor, backNavigator = navigator)
}
cascade
. This will override both overflow menu and sub menus for action items.toolbar.overrideAllPopupMenus(with = ::CascadePopupMenu)
MaterialComponents
theme.cascade
to crash on API 21 devices.PopupWindow
, where the internal paddings set by the default popup background aren’t reset even if the background is changed (https://github.com/saket/cascade/commit/79ace480f33bc7cd2726db5022c099deeb54d9c4).Toolbar
’s overflow menu (instructions)This release also adds a shared ViewPool for list items across sub-menus. This will benefit performance of popups with more than one sub-menus.