Jetpack Compose“onSurface”颜色不起作用

Gui*_*lva 4 android android-jetpack-compose

我正在使用 Jetpack Compose 测试材质主题,但我不确定为什么无法使主题的onSurface颜色正常工作。

这是颜色Theme.kt设置onSurfaceColor.Red

private val DarkColorPalette = darkColors(
    primary = Purple200,
    primaryVariant = Purple700,
    secondary = Teal200,
    onSurface = Color.Red, // <------- HERE
    onPrimary = Color.Blue, // <----- HERE
)

private val LightColorPalette = lightColors(
    primary = Purple500,
    primaryVariant = Purple700,
    secondary = Teal200,
    onSurface = Color.Red, // <------- AND HERE
    onPrimary = Color.Blue, // <----- HERE
)

@Composable
fun ExploringMaterialTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable() () -> Unit
) {
    val colors = if (darkTheme) {
        DarkColorPalette
    } else {
        LightColorPalette
    }

    MaterialTheme(
        colors = colors,
        typography = Typography,
        shapes = Shapes,
        content = content
    )
}
Run Code Online (Sandbox Code Playgroud)

这是活动:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyApp()
        }
    }
}

@Preview
@Composable
fun MyApp() {
    ExploringMaterialTheme {
        // I also tried
        // Surface(color = MaterialTheme.colors.surface) {
        Surface {
            Text(text = "Hello!!", modifier = Modifier.padding(16.dp))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待着“你好!!” 以红色显示,但相反,它以普通黑色显示。我有什么想法吗?

结果

当我在组件中设置颜色时,它的工作效果符合预期SurfaceSurface获得正确的on颜色(onPrimary在本例中):

        Surface(color = MaterialTheme.colors.primary) {
            Text(text = "Hello!!", modifier = Modifier.padding(16.dp))
        }
Run Code Online (Sandbox Code Playgroud)

结果2

Gab*_*tti 5

Surface组合使用:

CompositionLocalProvider(
        LocalContentColor provides contentColor){
            //
            content()
}
Run Code Online (Sandbox Code Playgroud)

其中 的contentColor定义为:

fun Colors.contentColorFor(backgroundColor: Color): Color {
    return when (backgroundColor) {
    primary -> onPrimary
    primaryVariant -> onPrimary
    secondary -> onSecondary
    secondaryVariant -> onSecondary
    background -> onBackground
    surface -> onSurface
    error -> onError
    else -> Color.Unspecified
    }
}
Run Code Online (Sandbox Code Playgroud)

目前您必须surface在主题中指定颜色:

private val LightColorPalette = lightColors(
    primary = Blue500,
    surface = Color.Yellow)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Text使用onSurface颜色。

如果您不指定颜色,surface组件Surface将使用background用作 colorBackground 并onBackground使用 用作Text.