Почему 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)
)