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

Jetpack Compose:如何使用维度资源自定义并提供TextStyle?

解决Jetpack Compose中自定义Typography并通过CompositionLocalProvider提供的问题

要实现自定义Typography并在CompositionLocal中提供,按以下步骤修改代码即可:

1. 定义CompositionLocal实例

首先创建一个CompositionLocal用于持有MyTypography实例,根据样式是否需要动态切换选择对应实现:

  • 样式全局固定用staticCompositionLocalOf(性能更优)
  • 需要动态切换样式用compositionLocalOf
// 全局固定样式场景的示例
val LocalMyTypography = staticCompositionLocalOf<MyTypography> {
    // 未提供实例时的默认异常提示
    error("MyTypography 未在 CompositionLocalProvider 中提供")
}

2. 在CompositionLocalProvider中注入实例

在MyApp中调用你的MyTypography() Composable生成实例,通过LocalMyTypography提供给子Composable:

@Composable
fun MyApp() {
    val customTypography = MyTypography()
    CompositionLocalProvider(LocalMyTypography provides customTypography) { 
        Text(text = "foo", style = LocalMyTypography.current.myStyle1)
    }
}

3. 优化MyTypography的实现

你的MyTypography()写法本身合法,可稍作简化提升可读性:

data class MyTypography(
    val myStyle1: TextStyle,
    val myStyle2: TextStyle,
)

@Composable
fun MyTypography(): MyTypography {
    val style1FontSize = dimensionResource(R.dimen.style1_text_size).value.sp
    val style2FontSize = dimensionResource(R.dimen.style2_text_size).value.sp
    
    return MyTypography(
        myStyle1 = TextStyle(color = Color.White, fontSize = style1FontSize),
        myStyle2 = TextStyle(color = Color.White, fontSize = style2FontSize)
    )
}

关键注意点

  • dimensionResource()必须在Composable上下文中调用,你的MyTypography()标注了@Composable,因此在这里调用完全合规,获取到的维度值转成sp后可直接用于TextStyle的fontSize参数。
  • 若后续需要支持主题切换,只需替换MyTypography()的实现逻辑,或在CompositionLocalProvider中动态传入不同的MyTypography实例即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:30:08