Почему accompanist-systemuicontroller не работает при использовании Jetpack Compose с Material3?
Я изучаю использование Material3 в компоновке реактивного ранца и пытаюсь сделать панель состояния прозрачной, как раньше. Однако со следующим кодом:
WindowCompat.setDecorFitsSystemWindows(window, false)
setContent {
val systemUiController = rememberSystemUiController()
SideEffect {
systemUiController.setSystemBarsColor(
color = Color.Transparent,
darkIcons = true
)
}
TestStatusBarTheme {
Surface(
modifier = Modifier
.statusBarsPadding()
.fillMaxSize(),
color = MaterialTheme.colorscheme.background
) {
Text(text = "Test")
}
}
}
В то время как панель навигации становится прозрачной, панель состояния все равно не меняется. Затем я применяю тот же код, на этот раз используя оригинальную библиотеку дизайна материалов, оставляя все остальное без изменений, и он работает правильно, так как строка состояния также становится прозрачной.
Я не могу понять, почему я не могу использовать аккомпаниатора для изменения строки состояния в material3. Когда навигационная панель становится прозрачной, очевидно, что systemUiController получил окно и может вносить изменения в навигационную панель, тогда почему он не может работать с панелью состояния, которая также является системной панелью? Есть ли что-то новое, чего я не заметил, чтобы заставить accompanist-systemuicontroller сотрудничать с Material3, или это просто неисправленная ошибка для текущей версии Material3 или аккомпаниатора?
Моя версия Compose — 1.2.0-beta02, версия аккомпаниатора — 0.24.9-beta, а версия material3 — 1.0.0-alpha12.
2 ответа
Я пытался перейти на Windows.Insets API в версии компоновщика 1.2.0-rc02. И вроде работает. Попробуйте запустить мой образец:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
makeStatusBarTransparent()
//WindowCompat.setDecorFitsSystemWindows(window, false)
setContent {
Box(
Modifier
.background(Color.Blue)
.fillMaxSize()
.padding(top = 10.dp, bottom = 10.dp)
.statusBarsPadding() //systemBarsPadding
) {
//Box(Modifier.background(Color.Green).navigationBarsPadding()) {
Greeting("TopStart", Alignment.TopStart)
Greeting("BottomStart", Alignment.BottomStart)
Greeting("TopEnd", Alignment.TopEnd)
Greeting("BottomEnd", Alignment.BottomEnd)
//}
}
}
/* setContent {
MyComposeApp1Theme {
// A surface container using the 'background' color from the theme
Surface(modifier = Modifier.fillMaxSize(), color = Color.Red) {
Box(Modifier
.fillMaxSize()
.padding(top = 34.dp)
) {
Greeting("Android")
}
}
}
}*/
}
}
@Composable
fun Greeting(name: String, contentAlignment: Alignment) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = contentAlignment
) {
Text(
text = "Hello $name!",
Modifier
.background(color = Color.Cyan)
)
}
}
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
MyComposeApp1Theme {
Greeting("Android", Alignment.TopStart)
}
}
@Suppress("DEPRECATION")
fun Activity.makeStatusBarTransparent() {
window.apply {
clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
statusBarColor = android.graphics.Color.GREEN//android.graphics.Color.TRANSPARENT
}
}
val Int.dp
get() = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
toFloat(),
Resources.getSystem().displayMetrics
)
Похоже на версию Material3Scaffold
добавляет вставки по умолчанию:
@ExperimentalMaterial3Api
@Composable
fun Scaffold(
...
contentWindowInsets: WindowInsets = ScaffoldDefaults.contentWindowInsets,
content: @Composable (PaddingValues) -> Unit
) {
Поэтому, если вы хотите добавить заполнение строки состояния, вам нужно удалить верхнюю вставку:
Scaffold(
modifier = Modifier
.statusBarsPadding(),
contentWindowInsets = WindowInsets(top = 0.dp)
)