跳转到内容

ListPopup

ListPopup 是 Miuix 中的弹出列表组件,用于显示一个包含多个选项的弹出菜单。它提供了一个轻量级的、悬浮在界面上的临时列表,适用于各种下拉菜单、上下文菜单等场景。

注意

ListPopup 需要在 Scaffold 组件内使用!

引入

kotlin
import top.yukonga.miuix.kmp.basic.ListPopup
import top.yukonga.miuix.kmp.basic.ListPopupColumn

基本用法

ListPopup 组件可以用于创建简单的下拉菜单:

kotlin
var showPopup = remember { mutableStateOf(false) }
var selectedIndex by remember { mutableStateOf(0) }
val items = listOf("选项 1", "选项 2", "选项 3")

Scaffold {
    Box {
        TextButton(
            text = "点击显示菜单",
            onClick = { showPopup.value = true }
        )
        ListPopup(
            show = showPopup,
            onDismissRequest = { showPopup.value = false } // 关闭弹出菜单
        ) {
            ListPopupColumn {
                items.forEachIndexed { index, string ->
                    DropdownImpl(
                        text = string,
                        optionSize = items.size,
                        isSelected = selectedIndex == index,
                        onSelectedIndexChange = {
                            selectedIndex = index
                            showPopup.value = false // 关闭弹出菜单
                        },
                        index = index
                    )
                }
            }
        }
    }
}

组件状态

不同位置对齐

ListPopup 可以设置不同的对齐方式:

kotlin
var showPopup = remember { mutableStateOf(false) }

ListPopup(
    show = showPopup,
    onDismissRequest = { showPopup.value = false } // 关闭弹出菜单
    alignment = PopupPositionProvider.Align.Left
) {
    ListPopupColumn {
        // 自定义内容
    }
}

禁用窗口变暗效果

kotlin
var showPopup = remember { mutableStateOf(false) }

ListPopup(
    show = showPopup,
    onDismissRequest = { showPopup.value = false } // 关闭弹出菜单
    enableWindowDim = false // 禁用遮罩层
) {
    ListPopupColumn {
        // 自定义内容
    }
}

属性

ListPopup 属性

属性名类型说明默认值是否必须
showMutableState<Boolean>控制弹出列表显示状态的状态对象-
popupModifierModifier应用于弹出列表的修饰符Modifier
popupPositionProviderPopupPositionProvider弹出列表的位置提供者ListPopupDefaults.DropdownPositionProvider
alignmentPopupPositionProvider.Align弹出列表的对齐方式PopupPositionProvider.Align.Right
enableWindowDimBoolean是否启用遮罩层true
shadowElevationDp弹出列表的阴影高度11.dp
onDismissRequest(() -> Unit)?弹出列表消失时的回调函数null
maxHeightDp?弹出列表的最大高度null (自动计算)
minWidthDp弹出列表的最小宽度200.dp
content@Composable () -> Unit弹出列表的内容-

ListPopupDefaults 对象

ListPopupDefaults 对象提供了 ListPopup 组件的默认设置。

属性

属性名类型说明
DropdownPositionProviderPopupPositionProvider用于下拉菜单场景的位置提供者
ContextMenuPositionProviderPopupPositionProvider用于上下文菜单场景的位置提供者

PopupPositionProvider 接口

PopupPositionProvider 接口定义了计算弹出列表位置的方法。

PopupPositionProvider.Align 选项

选项名说明
Left相对于窗口左侧对齐
Right相对于窗口右侧对齐
TopLeft相对于窗口左上角对齐
TopRight相对于窗口右上角对齐
BottomLeft相对于窗口左下角对齐
BottomRight相对于窗口右下角对齐

进阶用法

自定义内容布局

kotlin
var showPopup = remember { mutableStateOf(false) }

Scaffold {
    Box {
        TextButton(
            text = "点击显示菜单",
            onClick = { showPopup.value = true }
        )
        ListPopup(
            show = showPopup,
            minWidth = 250.dp,
            maxHeight = 300.dp,
            onDismissRequest = { showPopup.value = false } // 关闭弹出菜单
            alignment = PopupPositionProvider.Align.BottomRight,
        ) {
            ListPopupColumn {
                Column(modifier = Modifier.padding(16.dp)) {
                    Text(
                        "自定义标题",
                    )
                    Spacer(modifier = Modifier.height(8.dp))
                    HorizontalDivider()
                    Spacer(modifier = Modifier.height(8.dp))
                    Text("这是一个自定义内容的弹出菜单,您可以根据需要添加各种组件。")
                    Spacer(modifier = Modifier.height(16.dp))
                    Row(
                        modifier = Modifier.fillMaxWidth(),
                        horizontalArrangement = Arrangement.End
                    ) {
                        TextButton(
                            text = "确定",
                            onClick = { showPopup.value = false } // 关闭弹出菜单
                        )
                    }
                }
            }
        }
    }
}

基于 Apache-2.0 许可发布