Как не использовать пользовательский цвет в пользовательском TopAppBar

В определенное время я хочу использовать свой собственный цветовой ресурс ColorGreenизменить цвет фона моего пользовательского SmallTopAppBar, а в другое время я не хочу использовать его, чтобы вместо этого использовались черный и белый цвета по умолчанию в зависимости от текущей темы устройства. Каков наилучший способ избежать возможного исключения нулевого указателя? Следует ли использовать оператор if null в пользовательском коде панели инструментов? Должен nullиспользоваться в объявлении активности, где находятся подчеркивания?

Цвет.kt

      val ColorGreen = Color(0,110,20,255)

Пользовательский код панели инструментов

      package com.mycompany.myapp.ui.components

import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextAlign

@Composable
fun MySmallTopAppBar(
    backgroundColor: Color,
    title: String,
    titleColor: Color
) {
    SmallTopAppBar(
        colors = TopAppBarDefaults.smallTopAppBarColors(
            containerColor = backgroundColor),
        title = {
            Text(
                text = title,
                style = MaterialTheme.typography.titleMedium,
                textAlign = TextAlign.Start,
                maxLines = 1,
                color = titleColor
            )
        }
    )
}

в MainActivity.kt

      ...
    setContent {

        MyAppTheme {
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                Scaffold(
                    topBar = { MySmallTopAppBar(ColorGreen, getGreetingMessage(), __) }
                ) {
                }
            }
        }
    }
...

1 ответ

В таких случаях вам необходимо изучить исходный код компонента, чтобы понять, как он работает.

В случае Text, значение цвета по умолчанию Color.Unspecified- если используется это значение, цвет будет взят из стиля или из LocalContentColor(значение стиля тоже не указано). Поэтому, если вы хотите следовать поведению по умолчанию, вам также нужно передать это значение:

      val backgroundColor: Color?
// ...
MySmallTopAppBar(backgroundColor, getGreetingMessage(), if (backgroundColor == null) Color.Unspecified else Color.SomeColor)

В случае, если smallTopAppBarColorsзначение по умолчанию является внутренним, плюс, поскольку оно может измениться в будущем (поскольку материал 3 пока находится в альфа-версии), наиболее правильным способом будет что-то вроде этого:

      colors = if (backgroundColor != null)
    TopAppBarDefaults.smallTopAppBarColors(containerColor = backgroundColor)
else
    TopAppBarDefaults.smallTopAppBarColors(),
Другие вопросы по тегам