我当前的代码如下:
@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 }
)
希望这能有所帮助,如果你遇到任何问题,请告诉我。