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

Android Compose如何设置系统状态栏和导航栏与TopAppBar同色?

解决Composable调用报错:系统栏颜色同步主题变化问题

错误原因

  • MaterialTheme.colorScheme是Composable函数,必须在Composable上下文内调用
  • 原代码将SideEffect和systemUiController的初始化放在了MeganurseryResourceMgtTheme外部,此时还未进入主题的Composable作用域,无法获取主题的配色信息
  • SideEffect的lambda本身不属于Composable上下文,直接调用MaterialTheme.colorScheme必然触发报错

修正方案

将systemUiController的初始化和SideEffect代码移动到MeganurseryResourceMgtTheme内部,确保处于主题的Composable作用域中。这样既能正确获取主题颜色,还能在主题切换时通过Composable自动重组,同步更新系统栏颜色。

修正后的代码

import com.google.accompanist.systemuicontroller.rememberSystemUiController

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            MeganurseryResourceMgtTheme {
                val systemUiController = rememberSystemUiController()
                val surfaceColor = MaterialTheme.colorScheme.surface
                
                SideEffect {
                    systemUiController.setSystemBarsColor(
                        color = surfaceColor
                    )
                }

                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    AppNavigation()
                }
            }
        }
    }
}

额外说明

切换明暗主题时,MeganurseryResourceMgtTheme会触发重组,surfaceColor会自动获取新主题的颜色,SideEffect也会重新执行,系统栏颜色就会同步更新。如果需要更精准的状态监听,还可以用rememberUpdatedState包装surfaceColor,但主题切换场景下直接引用已经足够满足需求。

内容的提问来源于stack exchange,提问作者Nazir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:52:14