1

对于桌面,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 的方式来做这件事:)

4

0 回答 0