对于桌面,DropdownMenu 由 Gradle 提供:org.jetbrains.compose.material:material-desktop:1.0.1-rc2;对于 Android,它在 Gradle 中:androidx.compose.material:material:1.1.0-beta04@aar
我原以为会有一个共同的 API 都实现了。
我知道我可以定义自己的接口/适配器,然后插入特定于设备的版本,但我想知道是否有一个聪明的惯用 Kotlin 方法来做到这一点。
我尝试使用“期望”和“实际”,但我可以弄清楚语法。(DropdownMenu 没有像期望/实际使用示例中那样的简单签名)。
这是我正在使用的菜单示例...... Android 和桌面版本看起来相同:
// TODO is there way that this can be moved to Common
@Composable
fun BellSoundMenu(model: SessionViewModel, files: List<SoundFile>) {
val selectedIndex = remember { mutableStateOf(0) }
DropdownMenu(
expanded = model.isBellMenuExpanded.value,
...
) {
files.forEachIndexed { index, sound: SoundFile ->
DropdownMenuItem(onClick = {
selectedIndex.value = index
...
}) {
Row {
val isSelected = sound == model.getBellFile()
Icon(
...
)
Text(
...
)
}
}
}
}
}
我正在寻找一种将其移动到 Common 文件夹而不是重复代码的方法。
我最终这样做了;我创建了一个界面:
interface MyDropdown {
@Composable
fun Menu(
expanded: Boolean,
onDismissRequest: () -> Unit,
modifier: Modifier,
content: @Composable (androidx.compose.foundation.layout.ColumnScope.() -> Unit)
)
@Composable
fun MenuItem(
onClick: () -> Unit,
content: @Composable (androidx.compose.foundation.layout.RowScope.() -> Unit)
)
}
然后是一个小对象进行转发:
val AndroidDropdown = object : MyDropdown {
@Composable
override fun Menu(
expanded: Boolean,
onDismissRequest: () -> Unit,
modifier: Modifier,
content: @Composable (androidx.compose.foundation.layout.ColumnScope.() -> Unit)
) {
return DropdownMenu(
expanded = expanded, onDismissRequest = onDismissRequest, modifier = modifier, content = content
)
}
@Composable
override fun MenuItem(
onClick: () -> Unit, content: @Composable RowScope.() -> Unit
) {
return DropdownMenuItem(onClick = onClick, content = content)
}
}
我仍然很好奇是否有更 Kotlin 的方式来做这件事:)