gpt4 book ai didi

android - 在 Composable 函数之外引用或枚举 Jetpack Compose MaterialTheme 主题颜色

转载 作者:行者123 更新时间:2023-12-04 23:40:39 31 4
gpt4 key购买 nike

我希望为接受颜色的@Composable 函数提供一个参数,但只接受离散列表中的一个颜色。
类似这样的东西:

enum class SpecialColor(val color: Color) {
ALPHA(MaterialTheme.colors.onSurface),
BETA(MaterialTheme.colors.onSecondary)
}

@Composable
fun ColorSample(specialColor: SpecialColor) {
Box(
modifier = Modifier
.width(100.dp)
.height(100.dp)
.background(specialColor.color)
)
}

@Preview
@Composable
fun PreviewSample() {
CustomTheme {
ColorSample(specialColor = SpecialColor.ALPHA)
}
}
由于上面是在可组合上下文之外引用 MaterialTheme.colors,因此会出现以下错误:

@Composable invocations can only happen from the context of a@Composable function


如果直接引用颜色,而不是通过 MaterialTheme,颜色将无法正确更新为亮/暗模式等内容。
一种策略可能是将枚举值映射到 @Composable 函数本身内的 MaterialTheme 颜色。但这很麻烦,笨重,并且不能很好地扩展 - 想象一个更长的颜色列表和相同的 SpecialColor 列表希望重复用于许多功能。
另一种策略可能是直接使用 LocalContentColor 或类似的方法修改主题颜色,但这太宽泛了,并且会更改不仅仅是目标功能的颜色。
从实用程序@Composable 函数返回颜色也不是一种选择,因为@Composable 函数没有返回值。
所以...
关于如何提供 Compose Material 颜色的枚举列表之一作为参数的任何想法?
以干净且可扩展的方式很好地扩展?

最佳答案

这实际上是不正确的:

@Composable functions don't have return values.


您可以使用返回类型注释这两个函数,甚至可以使用 @Composable 注释只有 getter 的属性。 .例如 this是 Material 主题源代码的一部分。
以下是定义颜色的方法:
enum class SpecialColor {
ALPHA,
BETA,
;

val color: Color
@Composable
@ReadOnlyComposable
get() = when(this) {
ALPHA -> MaterialTheme.colors.onSurface
BETA -> MaterialTheme.colors.onSecondary
}
}

关于android - 在 Composable 函数之外引用或枚举 Jetpack Compose MaterialTheme 主题颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71659455/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com