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和WindowWindowCompat.getInsetsController()是官方推荐的兼容写法,能适配从低到高的Android版本isAppearanceLightStatusBars完全对应你原来用的darkIcons参数:设为false就是图标用浅色(和绿色栏适配刚好),设为true则是深色图标- 颜色值用
android.graphics.Color.parseColor()解析你原来的十六进制色值,和之前的Color(0xFF076C07)效果完全一致
如果你的Compose内容是在Fragment里使用,获取Window的逻辑也是一样的,从LocalView拿到Context再转成Activity就行。要是需要在页面销毁时恢复原来的状态栏样式,还可以配合DisposableEffect来做,但如果只是当前页面固定用这个样式,SideEffect就足够啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

