跳转到内容

WindowIconCascadingDropdownMenu

WindowIconCascadingDropdownMenu 是基于 IconButton 的封装,点击图标按钮后会展开 WindowCascadingListPopup(通过 Dialog 在窗口级别渲染)。与 OverlayIconCascadingDropdownMenu 不同,它不需要 ScaffoldDropdownItem.children 非空的项会成为子菜单触发行;级联深度限制为 2 级

引入

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

基本用法

WindowIconCascadingDropdownMenu 放在 TopAppBar(或 SmallTopAppBar)的 actions 槽中,点击图标即可展开弹出框。children 非空的顶层项会带 chevron,点击后就地展开二级菜单。菜单本身不依赖 Scaffold,但通常仍然以 Scaffold 来承载 TopAppBar

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 = {
                WindowIconCascadingDropdownMenu(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 = { /* ... */ }),
    ),
)

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

组件状态

禁用状态

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

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

级联深度

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

属性

WindowIconCascadingDropdownMenu 属性(Entries 重载)

属性名类型说明默认值是否必须
entriesList<DropdownEntry>由分割线分组的下拉条目;顶层中 children 非空的项会成为子菜单触发行-
modifierModifier应用于外层 Box 的修饰符Modifier
enabledBoolean图标按钮是否可交互true
maxHeightDp?级联弹窗任一面的最大高度null
dropdownColorsDropdownColors下拉选项的颜色配置DropdownDefaults.dropdownColors()
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 许可发布