You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Jetpack Compose中rememberSystemUiController废弃后的替代实现方案咨询

Android Jetpack Compose中rememberSystemUiController废弃后的替代实现方案咨询

嘿,我太懂你碰到API废弃时的无奈了!之前升级Compose库的时候也刚好踩过这个坑,rememberSystemUiController()确实已经被标记为废弃,官方现在推荐直接使用Android平台原生的WindowInsetsController来实现状态栏和导航栏的样式控制,其实用起来反而更直接,完全能达到你原来的效果。

你可以直接通过LocalView获取当前的Window实例,然后调用原生API来设置颜色和图标亮度,下面是和你原有需求完全匹配的代码:

import android.view.Window
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalView
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsControllerCompat

@Composable
fun GreenSystemBarsScreen() {
    val view = LocalView.current
    // 确保视图已关联到Window再执行操作
    if (!view.isAttachedToWindow) return
    
    val window = (view.context as android.app.Activity).window

    SideEffect {
        val insetsController = WindowCompat.getInsetsController(window, view)
        
        // 设置状态栏为目标绿色,图标用浅色(对应你原来的darkIcons = false)
        window.statusBarColor = android.graphics.Color.parseColor("#FF076C07")
        insetsController.isAppearanceLightStatusBars = false
        
        // 设置导航栏为目标绿色,图标用浅色
        window.navigationBarColor = android.graphics.Color.parseColor("#FF076C07")
        insetsController.isAppearanceLightNavigationBars = false
    }

    Surface(
        modifier = Modifier.fillMaxSize(),
        color = MaterialTheme.colorScheme.background
    ) {
        // 这里放你的页面内容
    }
}

给你划几个关键的点:

  • LocalView.current是Compose提供的获取当前视图的入口,通过它能拿到关联的Activity和Window
  • WindowCompat.getInsetsController()是官方推荐的兼容写法,能适配从低到高的Android版本
  • isAppearanceLightStatusBars完全对应你原来用的darkIcons参数:设为false就是图标用浅色(和绿色栏适配刚好),设为true则是深色图标
  • 颜色值用android.graphics.Color.parseColor()解析你原来的十六进制色值,和之前的Color(0xFF076C07)效果完全一致

如果你的Compose内容是在Fragment里使用,获取Window的逻辑也是一样的,从LocalView拿到Context再转成Activity就行。要是需要在页面销毁时恢复原来的状态栏样式,还可以配合DisposableEffect来做,但如果只是当前页面固定用这个样式,SideEffect就足够啦。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 10:48:01