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

如何修改使用PreviewParameter的Compose预览名称

如何为Compose的PreviewParameter预览设置自定义名称?

我想用PreviewParameter来预览同一个Composable的不同变体,不想为每种状态单独编写预览函数。

之前的写法(每个变体单独写预览函数)

@Preview
@Composable
private fun VariantAPreview() {
    // 变体A的预览实现
}

@Preview
@Composable
private fun VariantBPreview() {
    // 变体B的预览实现
}

@Preview
@Composable
private fun VariantCPreview() {
    // 变体C的预览实现
}

改用PreviewParameter后的写法

@Preview
@Composable
private fun PreviewAll(@PreviewParameter(Provider::class) data: Data) {
    // 基于传入的data渲染对应变体
}

但问题在于:Android Studio设计视图中,单独函数的预览名称是VariantAPreview、VariantBPreview这类直观的名称;而使用PreviewParameter后,预览名称会变成PreviewAll (data 0)、PreviewAll (data 1)、PreviewAll (data 2),很难区分不同变体。有没有办法给这些预览设置易识别的自定义名称?


解决方案

方法1:重写PreviewParameterProvider的getPreviewName方法

自定义PreviewParameterProvider时,重写getPreviewName方法,为每个参数实例指定专属名称,这是最直接的方案。

示例代码:

// 自定义PreviewParameterProvider
class DataPreviewProvider : PreviewParameterProvider<Data> {
    // 提供所有需要预览的Data实例
    override val values = sequenceOf(
        Data(/* 变体A的参数配置 */),
        Data(/* 变体B的参数配置 */),
        Data(/* 变体C的参数配置 */)
    )

    // 为每个索引对应的实例设置预览名称
    override fun getPreviewName(index: Int): String {
        return when(index) {
            0 -> "变体A"
            1 -> "变体B"
            2 -> "变体C"
            else -> super.getPreviewName(index)
        }
    }
}

// 使用自定义Provider的预览函数
@Preview
@Composable
private fun PreviewAll(@PreviewParameter(DataPreviewProvider::class) data: Data) {
    // 渲染你的Composable
}

设置完成后,Android Studio中的预览名称会变为PreviewAll (变体A)、PreviewAll (变体B)、PreviewAll (变体C),清晰易区分。

方法2:通过CompositionLocalProvider设置预览名称

如果无法修改PreviewParameterProvider,可以在预览函数中根据Data实例的特征匹配名称,再通过LocalPreviewInfo设置预览显示名。

示例代码(假设Data是密封类):

@Preview
@Composable
private fun PreviewAll(@PreviewParameter(Provider::class) data: Data) {
    // 根据Data的类型或特征匹配名称
    val previewName = when(data) {
        is Data.VariantA -> "变体A"
        is Data.VariantB -> "变体B"
        is Data.VariantC -> "变体C"
        else -> "未知变体"
    }

    // 注入预览名称
    CompositionLocalProvider(LocalPreviewInfo provides PreviewInfo(name = previewName)) {
        // 渲染你的Composable
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:55:10