Как не использовать пользовательский цвет в пользовательском 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(),