Compose:如何仅更改指定屏幕的状态栏颜色?

BAr*_*ell 2 android android-statusbar android-jetpack-compose

我有一个应用程序,其中除 2-3 个屏幕外的所有屏幕都具有相同的状态栏颜色。

因此,目的是在打开此屏幕时更改状态栏颜色,并在关闭此屏幕时将状态栏颜色重置为主题的默认颜色。

我正在尝试用以下方法来实现它DisposableEffect

DisposableEffect(Unit) {
    systemUiController.setStatusBarColor(color = anotherColor)
    onDispose {
        systemUiController.setStatusBarColor(color = defaultColor)
    }
}
Run Code Online (Sandbox Code Playgroud)

它可以工作,但有延迟,不与 TopAppBar 同步:

在此输入图像描述

正确实施的方法是什么?

Aag*_*oEx 6

我认为延迟是不可避免的,我从未见过它立即改变。

我总是选择透明状态栏+在系统栏后面绘制并自己处理所有事情。在系统栏后面绘图是新推荐的方法。由于您已经在使用 compose,因此在 accompanist lib + compose 1.2.0 的帮助下非常容易,内置了插入修饰符来帮助实现此目的。

要求您的活动从边到边布置(在系统栏后面绘制)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    WindowCompat.setDecorFitsSystemWindows(window, false)
}
Run Code Online (Sandbox Code Playgroud)

使用accompanist UIController lib,将状态栏颜色设置为透明。

systemUiController.setSystemBarsColor(
    color = Color.Transparent,
    darkIcons = useDarkIcons
)
Run Code Online (Sandbox Code Playgroud)

在您的可组合项中,根据需要使用适当的插图。

Modifier.fillMaxSize()
        .statusBarsPadding() //status bar insets
        .navigationBarsPadding() //nav bar insets
        .systemBarsPadding() //both
Run Code Online (Sandbox Code Playgroud)

编辑:您可以创建一个一次性效果包装器来切换系统图标,并在您需要的任何地方使用它。例如:(你可以改进这个)

@Composable
fun initSystemUi(
    useDarkIcons: Boolean = MaterialTheme.colors.isLight,
    systemUiController: SystemUiController = rememberSystemUiController()
) {
    DisposableEffect(Unit) {
        systemUiController.setSystemBarsColor(
            color = Color.Transparent,
            darkIcons = useDarkIcons
        )
        onDispose {
            systemUiController.setSystemBarsColor(
                color = Color.Transparent,
                darkIcons = useDarkIcons
            )
        }
    }
}
Run Code Online (Sandbox Code Playgroud)