在某些时候,我想使用我自己的颜色资源ColorGreen
来改变我自定义SmallTopAppBar
的背景颜色,而在其他时候,我不想使用它,以便根据设备的当前主题使用默认的黑色和白色。避免可能的空指针异常的最佳方法是什么?应该在自定义工具栏代码中使用'if null'语句吗?应该在活动声明中使用null
,其中下划线是?
Color.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(), __) }
) {
}
}
}
}
...
在这种情况下,您需要检查组件源代码以了解它是如何工作的。
在Text
的情况下,默认的颜色值是Color.Unspecified
-如果使用这个值,颜色将取自样式或LocalContentColor
(样式值也未指定)。因此,如果你想遵循默认行为,你需要传递这个值:
val backgroundColor: Color?
// ...
MySmallTopAppBar(backgroundColor, getGreetingMessage(), if (backgroundColor == null) Color.Unspecified else Color.SomeColor)
如果smallTopAppBarColors
的默认值是内部的,再加上它可能会在未来改变(因为材料3目前还在alpha中),最正确的方法是这样的:
colors = if (backgroundColor != null)
TopAppBarDefaults.smallTopAppBarColors(containerColor = backgroundColor)
else
TopAppBarDefaults.smallTopAppBarColors(),