新版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
相关产品推荐
相关产品推荐

