跳转到内容

OverlayIconDropdownMenu ​

OverlayIconDropdownMenu 是基于 IconButton 的封装,点击图标按钮后会展开 OverlayDropdownPopup。适用于工具栏的 action 槽位,例如 TopAppBar 的右侧动作按钮——单个图标按钮展开后呈现一组动作、排序选项或筛选开关。

使用前提

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

引入 ​

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

基本用法 ​

将 OverlayIconDropdownMenu 放在 TopAppBar(或 SmallTopAppBar)的 actions 槽中,点击图标即可展开弹出框。这是最典型的使用场景——工具栏上的一个图标按钮,展开后呈现一组菜单项。

kotlin
val entry = DropdownEntry(
    items = listOf("编辑", "复制", "分享", "删除").map { text ->
        DropdownItem(text = text, onClick = { /* 处理动作 */ })
    }
)

Scaffold(
    topBar = {
        SmallTopAppBar(
            title = "收件箱",
            actions = {
                OverlayIconDropdownMenu(entry = entry) {
                    Icon(imageVector = MiuixIcons.Edit, contentDescription = "动作菜单")
                }
            }
        )
    }
) { padding ->
    // 页面内容
}

也可以将 OverlayIconDropdownMenu 用在 TopAppBar 之外的位置——只要外层位于 Scaffold 中,任何能放 IconButton 的地方都能放它。

排序 / 单选 ​

对于排序菜单或单选场景,在每个 DropdownItem 上设置 selected,并保持 collapseOnSelection = true(entry 重载的默认值),让弹出框在每次选中后自动关闭。

kotlin
var sortIndex by remember { mutableStateOf(0) }
val entry = DropdownEntry(
    items = listOf("名称", "日期", "大小").mapIndexed { index, text ->
        DropdownItem(text = text, selected = sortIndex == index, onClick = { sortIndex = index })
    }
)

Scaffold {
    OverlayIconDropdownMenu(entry = entry) {
        Icon(imageVector = MiuixIcons.Sort, contentDescription = "排序")
    }
}

多选 ​

用一个 Set 跟踪选中值,在每个条目的 onClick 中切换状态,并设置 collapseOnSelection = false 让弹出框在多次选择之间保持打开。

kotlin
var selected by remember { mutableStateOf(setOf("照片")) }
val entry = DropdownEntry(
    items = listOf("照片", "视频", "文件").map { text ->
        DropdownItem(
            text = text,
            selected = text in selected,
            onClick = {
                selected = if (text in selected) selected - text else selected + text
            }
        )
    }
)

Scaffold {
    OverlayIconDropdownMenu(entry = entry, collapseOnSelection = false) {
        Icon(imageVector = MiuixIcons.SelectAll, contentDescription = "多选")
    }
}

分组菜单 ​

传入 entries: List<DropdownEntry> 即可显示由分割线隔开的多个分组。

kotlin
val entries = listOf(
    DropdownEntry(items = listOf("条目 A-1", "条目 A-2").map { DropdownItem(text = it) }),
    DropdownEntry(items = listOf("条目 B-1", "条目 B-2", "条目 B-3").map { DropdownItem(text = it) })
)

Scaffold {
    OverlayIconDropdownMenu(entries = entries) {
        Icon(imageVector = MiuixIcons.MoreCircle, contentDescription = "更多")
    }
}

组件状态 ​

禁用状态 ​

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

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

属性 ​

OverlayIconDropdownMenu 属性(Entries 重载) ​

属性名类型说明默认值是否必须
entriesList<DropdownEntry>由分割线隔开的下拉选项分组-是
modifierModifier应用于外层 Box 的修饰符Modifier否
enabledBoolean图标按钮是否可交互true否
maxHeightDp?下拉菜单的最大高度null否
dropdownColorsDropdownColors下拉选项的颜色配置DropdownDefaults.dropdownColors()否
renderInRootScaffoldBoolean是否在根(最外层)Scaffold 中渲染弹窗。为 true 时,弹窗覆盖全屏。为 false 时,在当前 Scaffold 的范围内渲染并进行位置补偿true否
collapseOnSelectionBoolean每次选中后是否关闭弹出框entries.size <= 1否
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)?点击选项时触发的回调null否
icon@Composable ((Modifier) -> Unit)?显示在选项文本前的图标null否
summaryString?显示在选项文本下方的摘要文本null否
childrenList<DropdownItem>?可选的子菜单项;仅级联变体null否
属性名类型说明
contentColorColor选项标题颜色
summaryColorColor选项摘要颜色
containerColorColor选项背景颜色
selectedContentColorColor选中项标题颜色
selectedSummaryColorColor选中项摘要颜色
selectedContainerColorColor选中项背景颜色
selectedIndicatorColorColor选中指示图标颜色

变更日志

基于 Apache-2.0 许可发布