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.kt 和 Type.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
我正在使用 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.kt 和 Type.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