You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新版Jetpack Compose中如何在DropdownMenuItem内添加自定义组件

解决方案

针对你的需求,新版Material3的DropdownMenuItem的text参数本身支持传入任意Composable组件,你可以直接将自定义的PriorityItem放入该参数中,同时遍历所有优先级选项生成对应的下拉菜单项。修改后的SortAction组件代码如下:

@Composable
fun SortAction(onSortClicked: (Priority) -> Unit) {
    var expanded by remember { mutableStateOf(false) }

    IconButton(onClick = { expanded = true }) {
        Icon(
            painter = painterResource(id = R.drawable.baseline_filter_list_24),
            contentDescription = stringResource(R.string.sort_tasks)
        )
    }

    DropdownMenu(
        expanded = expanded,
        onDismissRequest = { expanded = false }
    ) {
        // 遍历所有优先级选项,生成对应的下拉菜单项
        enumValues<Priority>().forEach { priority ->
            DropdownMenuItem(
                text = { PriorityItem(priority) },
                onClick = {
                    onSortClicked(priority)
                    expanded = false // 点击后关闭下拉菜单
                }
            )
        }
    }
}

关键说明:

  • 新版DropdownMenuItem的text参数是@Composable () -> Unit类型,因此可以直接传入你的自定义PriorityItem组件,无需依赖旧版的Row作用域。
  • 通过enumValues<Priority>()遍历所有优先级枚举值(假设Priority是枚举类),自动生成所有下拉选项,避免重复写三次相同代码。
  • 点击每个下拉项时,触发外部传入的onSortClicked回调,并将expanded设为false关闭下拉菜单。

假设你的Priority枚举类定义如下(可根据实际情况调整):

enum class Priority(val color: Color, val name: String) {
    LOW(Color.Green, "低优先级"),
    MEDIUM(Color.Yellow, "中优先级"),
    HIGH(Color.Red, "高优先级")
}

内容的提问来源于stack exchange,提问作者Dr Mido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:05:05