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

