Android compose - 模块化应用程序设计 - 如何管理主题?

Android compose - modular app design - how to manage theming?

我正在使用 Android Compose 模块化测试应用程序并让应用程序运行良好,但似乎如果您想添加颜色和字体等自定义主题,您 运行成问题。

因此,作为 app/src/main/java/com/xx/myapp/theme/ 下的示例,我们扩展 Color.kt

val Green900 = Color(0XFF242d2d)
val Green800 = Color(0XFF354242)

val Colors.green800: Color
    @Composable
    get() = Green800

val Colors.green700: Color
    @Composable
    get() = Green700

现在尝试在任何“模块”中使用这些是不可能的,我能看到的唯一方法是在每个模块中复制整个主题结构,这看起来很愚蠢?

所以如果我在结构中有一个模块作为例子 components/src/main/java/com/xx/components/BottomNavBar.kt 我不能使用

selectedContentColor = MaterialTheme.colors.gray800,

除非我在这个模块中复制 Color.kt 或者我在这个模块的 build.gradle.kts 中包含“app”模块...

 "implementation"(project(Modules.app))

如果我没记错的话会导致“循环依赖”

关于如何在不重复的情况下管理它的任何建议?

谢谢 J

据我了解,一种方法是只为共享定义创建一个模块,这样您就不需要导入整个应用程序模块。这个共享模块当然也会被app模块导入。

更普遍的是,每当你有循环依赖时,你需要检查解决方案是否可以将模块拆分成更小的模块,从而打破循环。

在您的 ui.theme 文件夹中,其中包括 Color.kt、Shape.kt、Theme.ktType.kt 你需要在 Color.kt

中定义你的颜色
val Green900 = Color(0XFF242d2d)
val Green800 = Color(0XFF354242)

在你的 Theme.kt 中,你为整个应用程序定义了你的一般主题,我看起来像这样:

@Composable
fun AppTheme(content: @Composable() () -> Unit) {

    MaterialTheme(
        colors = LightColorPalette,
        typography = Typography,
        shapes = Shapes,
        content = content
    )
}

还有:

val LightColorPalette = lightColors(
    primary = Green900,
    primaryVariant = Green800,
    secondary = Green200

    /* Other default colors to override
    background = Color.White,
    surface = Color.White,
    onPrimary = Color.White,
    onSecondary = Color.Black,
    onBackground = Color.Black,
    onSurface = Color.Black,
    */
)

如您所见,您可以使用您定义的颜色定义所有所需的表面、背景等,然后像这样使用它:

MaterialTheme.colors.primary

你也可以看看here on the official documentation