使用Android Studio可组合预览与多个风味的项目



我有一个有几种风格的项目。每一种风格都有自己的配置,可以在各自项目结构的assets文件夹中以json文件的形式获得。

在主题定义中,我使用Gson读取JSON并将其转换为相应的模型。

我现在的问题是:

在应用程序运行时,这一切都工作得很好,但在Android Studio的可组合预览中,不幸的是它只适用于单一风格。只要我切换到构建变体中的另一种风格,旧变体的json资产就会继续加载。由于配置还包含仅在各自风格中可用的资产,这将导致预览崩溃。我调试了预览处理抛出一些异常在铸造过程中,它似乎,如果有一些缓存和不重置后构建变量的变化。重新启动Android Studio也没有帮助,所以我不知道该怎么做。

有没有人注意到类似的行为和/或找到解决方案?

下面是一些代码来解释::

主题定义:

object AppTheme {
val colors: AppColors
@Composable
@ReadOnlyComposable
get() = LocalAppColors.current
val typography: AppTypography
@Composable
@ReadOnlyComposable
get() = LocalAppTypography.current
val configuration: ConfigurationC
@Composable
@ReadOnlyComposable
get() = LocalAppConfiguration.current
}
private val LocalAppColors = staticCompositionLocalOf {
lightAppColors
}
private val LocalAppTypography = staticCompositionLocalOf {
appTypography
}
private val LocalAppConfiguration = staticCompositionLocalOf {
ConfigurationC()
}
@Composable
fun AppTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit,
) {
val colors = if (darkTheme) darkAppColors else lightAppColors
CompositionLocalProvider(
LocalAppConfiguration provides ConfigurationC.init(LocalContext.current),
LocalAppColors provides colors,
LocalAppTypography provides typography,
) {
MaterialTheme(
colors = colors.materialColors,
typography = typography.materialTypography,
content = content,
)
}
}

简单预览:

@Composable
@Preview(name = "light", showBackground = true)
@Preview(name = "dark", showBackground = true, uiMode = UI_MODE_NIGHT_YES)
fun EnabledPreview() {
AppTheme {
Button.MyCustomButton(
modifier = Modifier,
title = "Custom Button",
font = AppTheme.configuration.font.h1
color = AppTheme.configuration.colors.text1
enabled = enabled,
onClick = {}
)

}
}

我在一个白标解决方案项目中也遇到过这个问题。你可以用PreviewParameter

很好地解决这个问题定义ColorsProvider类:
class ColorsProvider: PreviewParameterProvider<AppColors> {
override val values: Sequence<AppColors> = sequenceOf(
darkAppColors,
lightAppColors,
// add more color options here if needed
}
@Preview(showBackground = true)
@Composable
fun GreetingTextPreview(
@PreviewParameter(ColorsProvider::class) colors: AppColors
) {
AppTheme(colors){}
}

现在你可以在任何预览中使用这个参数:

@Composable
fun ComponentPreview(
@PreviewParameter(ColorsProvider::class) colors: AppColors,
) {
AppTheme(colors = colors) {
// your preview content
}
}