如何在喷气背包中有多个自定义主题



我当前的代码如下:


@Composable
fun AppTheme(darkTheme: Boolean = false,
             content: @Composable() () -> Unit) {
    val colors = if (darkTheme) DarkThemeColors else LightThemeColors
    MaterialTheme(
        colors = colors,
        typography = MaterialTheme.typography,
        shapes = MaterialTheme.shapes,
    ) {
        content()
    }
}

我调用的主要活动是:


    @Inject
    lateinit var application: WeatherApplication
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            AppTheme(darkTheme = application.isDark.value) {
                WeatherApp(onToggleTheme = { application.toggleLightTheme()} )
            }

切换灯光主题基本上是这样的:
isDark.value=!isDark.value

然后我在另一个屏幕上点击:

@Composable
fun SettingsScreen(onToggleTheme: () -> Unit)
IconButton(onClick = onToggleTheme)

这完成了黑暗和光明的主题,现在如果我想有更多的主题,那么也许是这样的东西呢?

@Composable
fun AppTheme(currentTheme: String,
             content: @Composable() () -> Unit) {
    val colors = when (currentTheme) {
        "Pink" -> PinkThemeColors
        "Light" -> LightThemeColors
        "Red" -> RedThemeColors
        "Rainbow" -> RainbowTheme
        else -> LightThemeColors
    }
    MaterialTheme(
        colors = colors,
        typography = MaterialTheme.typography,
        shapes = MaterialTheme.shapes,
    ) {
        content()
    }
}

在另一个屏幕上的onClick按钮中,我该如何称呼它(一个按钮代表红色,另一个代表粉色等(?

我还是一个初学者,所以很抱歉有任何困惑,任何帮助都将不胜感激。

我也是一个初学者,所以请考虑我只回答您的主要问题,我不考虑您的代码是否具有良好的架构或遵循最佳实践(这就是为什么我在示例中也使用硬编码字符串,但您应该避免这样做。我只是这样做,因为这会让您更容易理解解决方案。)。我认为你的主要问题不是你在标题中提出的问题,而是最后一个问题:";在另一个屏幕上的onClick按钮中,我该如何称呼它(一个按钮代表红色,另一个代表粉色等(&";。因此,您已经通过使用回调切换布尔变量来设置主题,现在您想要的是使用字符串变量从两个以上的主题中进行选择。如果您想通过回调传递String值,可以执行以下操作:

@Composable
fun SettingsScreen(onChooseTheme: (String) -> Unit) {
    IconButton(onClick = { onChooseTheme("Pink") })
    IconButton(onClick = { onChooseTheme("Light") })
    IconButton(onClick = { onChooseTheme("Red") })
    IconButton(onClick = { onChooseTheme("Rainbow") })
}

WeatherApplication类的源代码没有提供,但基于您的代码,我认为这就是您想要使用层次结构中传递的值的地方,可以这样实现:

SettingsScreen(
    onChooseTheme = { currentTheme = it }
)

it是字符串值的关键字,您也可以这样重命名它:

SettingsScreen(
    onChooseTheme = { chosenTheme ->
        currentTheme = chosenTheme }
)

希望这能有所帮助,如果你遇到任何问题,请告诉我。

相关内容

  • 没有找到相关文章

最新更新