Как правильно получить Color (Jetpack Compose) из ресурсов?

Я использую ресурсы так как мне нужно поддерживать несколько BuildVariants. У меня есть Color.kt где я определил все цвета и получаю и их из color.xml вот так

val MyWhiteColor: Color = Color(R.color.my_white_color)

Применяю вот так

    Text(
        text = ...,
        style = TextStyle(
            color = MyWhiteColor
        )
    )

Проблема в том, что я получаю синий цвет вместо белого, но если я меняю получение цвета не из color.xml, то есть вот так

val MyWhiteColor: Color = Color(android.graphics.Color.parseColor("#FFFFFF"))

То все работает правильно и я получаю белый цвет.

Что я пропускаю? Почему когда я обращаюсь в color.xml то получаю синий вместо белого?

UPD

<color name="my_white_color">#FFFFFF</color>

Ответы (1 шт):

Автор решения: Vadik

Посмотрите на сигнатуру функции Color(), в качестве аргумента нужно передавать @ColorInt, а не @ColorRes. Это не будет работать, вы будете получать какой-то произвольный цвет:

Color(R.color.my_white_color)

Если у вас весь проект написан на Compose, то откажитесь от использования colors.xml, либо используйте этот файл по минимуму. Храните исходные значения цветов вашего приложения в Color.kt.


Если у вас некоторые цвета все равно остаются в colors.xml, то используйте темы. Вы можете создать свою CompositionLocal тему либо воспользоваться готовой MaterialTheme:

@Composable
fun MyAppTheme(isDark: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {
    MaterialTheme(
        colors = if (isDark) getDarkColors() else getLightColors(),
        typography = Typography,
        shapes = Shapes,
        content = content
    )
}

Где getDarkColors() и getLightColors() это Composable-функции, в которых вы можете использовать функцию colorResource, чтобы достать цвет, например:

@Composable
fun getDarkColors() = lightColors(
    primary = colorResource(id = R.color.primaryColor),
    onPrimary = colorResource(id = R.color.onPrimaryColor),
    ...
)

После того, как вы примените эту тему в вашем корневом Composable, вы сможете брать цвета из темы следующим образом:

MaterialTheme.colors.primary
→ Ссылка