【问题标题】:Is CompositionLocalProvider the only approach for custom Compose Theme?CompositionLocalProvider 是自定义 Compose 主题的唯一方法吗?
【发布时间】:2023-01-30 23:14:09
【问题描述】:

我正在研究具有自己的设计系统的应用程序的主题。在阅读了关于自定义主题的official documentation 后,我有一些疑问。

是否有任何理由将不同的规范作为 CompositionLocals 提供?我理解在某些情况下,比如颜色,我们有可能需要触发诸如(深色/浅色)之类的东西的重组,但对于印刷术,为什么要通过CompositionLocal 提供它而不是直接从静态变量访问它们呢?拥有自定义排版规范意味着无论如何都要使用 Material Components“won't work”,对吧?

对于上下文,排版规范类似于 XXL、XL、L、M、S..(由 h1、h2.. 代替),具有预定义的尺寸(粗细等)。它可以建模为具有全局object,可以从任何地方访问而不是提供的类......这有意义吗?

【问题讨论】:

  • 使用当前的方法库可以为元素定义默认值,比如默认按钮背景颜色是MaterialTheme.colors.primary,而不知道实际的运行时值。
  • 是的,是的,但正如我所说,使用此材料组件的自定义颜色/错字规范(不同于主要、次要等)变得“无用”,因为它们指向材料规范..所以你不会从中受益这些默认值因为不传递某些东西最终意味着使用来自不同规范的值
  • 材料值仅用于材料元素。它们不是 Compose 本身的一部分。如果你不使用它们,你也不必使用这些值,你可以定义任何你想要的颜色系统。
  • “是否有任何理由将不同的规范作为 CompositionLocals 提供?” -- 形式为“为什么开发人员 X 做出决策 Y?”的问题不适合 Stack Overflow。通常,只有开发人员 X 可以给出答案,其他人都只是猜测。 “对于 Typographies,为什么要通过 CompositionLocal 提供它而不是直接从静态变量访问它们呢?” -- 不要求排版在整个过程中保持静态。也许在您的应用程序中它不会改变;在其他应用程序中,它可能。

标签: android-jetpack-compose


【解决方案1】:

我使用 composition local 在任何地方访问自定义间距,如下所示

间距.kt

data class Spacing(
    val default : Dp = 0.dp,
    val extraSmall: Dp = 4.dp,
    val small: Dp = 8.dp,
    val large: Dp = 12.dp,
    val extraLarge: Dp = 16.dp,
)

val LocalSpacing = compositionLocalOf { Spacing() }

val MaterialTheme.spacing: Spacing
    @Composable
    @ReadOnlyComposable
    get() = LocalSpacing.current

主题.kt

@Composable
fun PokedexTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {
    val colors = if (darkTheme) {
        DarkColorPalette
    } else {
        LightColorPalette
    }
    
    CompositionLocalProvider(
        LocalSpacing provides Spacing()
    ) {
        MaterialTheme(
            colors = colors,
            typography = Typography,
            shapes = Shapes,
            content = content
        )
    }
}

访问它作为:

MaterialTheme.Spacing.large

【讨论】:

    猜你喜欢
    • 2019-05-16
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 2014-09-04
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    相关资源
    最近更新 更多