跳转到内容

OverlayIconCascadingDropdownMenu

OverlayIconCascadingDropdownMenu 是基于 IconButton 的封装,点击图标按钮后会展开 OverlayCascadingListPopup。适用于工具栏的 action 槽位(例如 TopAppBar 的右侧动作按钮)——单个图标按钮展开后呈现一组带子菜单的项。DropdownItem.children 非空的项会成为子菜单触发行;级联深度限制为 2 级

使用前提

此组件依赖 Scaffold 提供的 MiuixPopupHost 以显示弹出内容。必须在 Scaffold 中使用,否则弹出内容无法正常渲染。

引入

kotlin
import top.yukonga.miuix.kmp.menu.OverlayIconCascadingDropdownMenu
import top.yukonga.miuix.kmp.basic.DropdownEntry
import top.yukonga.miuix.kmp.basic.DropdownItem

基本用法

OverlayIconCascadingDropdownMenu 放在 TopAppBar(或 SmallTopAppBar)的 actions 槽中,点击图标即可展开弹出框。children 非空的顶层项会带 chevron,点击后就地展开二级菜单。

kotlin
var sortIndex by remember { mutableStateOf(0) }
var viewIndex by remember { mutableStateOf(0) }
var filterIndex by remember { mutableStateOf(0) }

val sortLabels = listOf("按拍摄日期排序", "按添加日期排序")
val viewLabels = listOf("按日期分组", "紧凑视图")
val filterLabels = listOf("全部内容", "相机相册")

val entries = listOf(
    DropdownEntry(
        items = sortLabels.mapIndexed { idx, label ->
            DropdownItem(
                text = label,
                selected = sortIndex == idx,
                onClick = { sortIndex = idx },
            )
        },
    ),
    DropdownEntry(
        items = listOf(
            DropdownItem(
                text = "查看模式",
                children = viewLabels.mapIndexed { idx, label ->
                    DropdownItem(
                        text = label,
                        selected = viewIndex == idx,
                        onClick = { viewIndex = idx },
                    )
                },
            ),
            DropdownItem(
                text = "筛选",
                children = filterLabels.mapIndexed { idx, label ->
                    DropdownItem(
                        text = label,
                        selected = filterIndex == idx,
                        onClick = { filterIndex = idx },
                    )
                },
            ),
        ),
    ),
)

Scaffold(
    topBar = {
        SmallTopAppBar(
            title = "图库",
            actions = {
                OverlayIconCascadingDropdownMenu(entries = entries) {
                    Icon(imageVector = MiuixIcons.Tune, contentDescription = "调整")
                }
            }
        )
    }
) { padding ->
    // 页面内容
}

单 Entry 重载

只需要一个分组时,可以使用 entry 重载省略外层的 listOf(...)

kotlin
val entry = DropdownEntry(
    items = listOf(
        DropdownItem(
            text = "查看模式",
            children = listOf(
                DropdownItem(text = "按日期分组", onClick = { /* ... */ }),
                DropdownItem(text = "紧凑视图", onClick = { /* ... */ }),
            ),
        ),
        DropdownItem(text = "刷新", onClick = { /* ... */ }),
    ),
)

Scaffold {
    OverlayIconCascadingDropdownMenu(entry = entry) {
        Icon(imageVector = MiuixIcons.Tune, contentDescription = "调整")
    }
}

组件状态

禁用状态

kotlin
OverlayIconCascadingDropdownMenu(
    entry = DropdownEntry(items = listOf(DropdownItem(text = "选项 1"))),
    enabled = false,
) {
    Icon(imageVector = MiuixIcons.MoreCircle, contentDescription = "更多")
}

当所有 DropdownEntry 都不包含任何条目时,菜单也会被隐式禁用。

级联深度

级联深度上限为 2。二级菜单中的项不会再处理自己的 children;更深层的子树会被静默忽略。

属性

OverlayIconCascadingDropdownMenu 属性(Entries 重载)

属性名类型说明默认值是否必须
entriesList<DropdownEntry>由分割线分组的下拉条目;顶层中 children 非空的项会成为子菜单触发行-
modifierModifier应用于外层 Box 的修饰符Modifier
enabledBoolean图标按钮是否可交互true
maxHeightDp?级联弹窗任一面的最大高度null
dropdownColorsDropdownColors下拉选项的颜色配置DropdownDefaults.dropdownColors()
renderInRootScaffoldBoolean是否在根(最外层)Scaffold 中渲染弹窗。为 true 时,弹窗覆盖全屏。为 false 时,在当前 Scaffold 的范围内渲染并进行位置补偿true
collapseOnSelectionBoolean选中任何叶子项后是否关闭弹出框true
onExpandedChange((Boolean) -> Unit)?展开状态变化时的回调null
backgroundColorColor底层 IconButton 的背景颜色Color.Unspecified
cornerRadiusDp底层 IconButton 的圆角半径IconButtonDefaults.CornerRadius
minHeightDp底层 IconButton 的最小高度IconButtonDefaults.MinHeight
minWidthDp底层 IconButton 的最小宽度IconButtonDefaults.MinWidth
content@Composable () -> Unit按钮内显示的图标(或其他可组合内容)-

Entry 重载属性

属性名类型说明默认值是否必须
entryDropdownEntry单个下拉选项分组-
collapseOnSelectionBoolean选中任何叶子项后是否关闭弹出框true

其余参数与上方 entries 重载完全一致。

属性名类型说明默认值是否必须
itemsList<DropdownItem>此分组中显示的条目-
enabledBoolean此分组是否启用。为 false 时禁用整组条目;为 true 时仍会遵循每个条目的 enabled 状态true
属性名类型说明默认值是否必须
textString选项显示的文本-
enabledBoolean选项是否可点击,禁用时置灰true
selectedBoolean选项是否处于选中状态false
onClick(() -> Unit)?点击选项时触发的回调。当 children 非空时被忽略(点击会改为展开二级菜单)null
icon@Composable ((Modifier) -> Unit)?显示在选项文本前的图标null
summaryString?显示在选项文本下方的摘要文本null
childrenList<DropdownItem>?可选的子菜单项;仅级联变体会将其渲染为二级菜单(最多两级)null
属性名类型说明
contentColorColor选项标题颜色
summaryColorColor选项摘要颜色
containerColorColor选项背景颜色
selectedContentColorColor选中项标题颜色
selectedSummaryColorColor选中项摘要颜色
selectedContainerColorColor选中项背景颜色
selectedIndicatorColorColor选中指示图标颜色

变更日志

基于 Apache-2.0 许可发布