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

如何让Jetpack Compose Material3的MediumTopAppBar始终保持折叠状态?

实现MediumTopAppBar分屏幕控制折叠/展开的最佳方案

核心思路是通过共享TopAppBar状态+路由判断,针对不同屏幕分别配置滚动行为和强制折叠逻辑,具体步骤如下:

1. 共享TopAppBar状态

首先在父容器(比如导航宿主所在的Composable)中创建全局的TopAppBar状态和默认滚动行为,确保所有屏幕都能访问同一状态实例:

val topAppBarState = rememberTopAppBarState()
val defaultScrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(topAppBarState)

2. 针对不同屏幕配置逻辑

可折叠/展开的屏幕

这类屏幕(比如带列表的页面)直接使用默认滚动行为,绑定嵌套滚动即可实现滚动时自动折叠/展开:

// 示例:带列表的可折叠屏幕
LazyColumn(
    modifier = Modifier.nestedScroll(defaultScrollBehavior.nestedScrollConnection)
) {
    items(100) { index ->
        Text("列表项 $index", modifier = Modifier.padding(16.dp))
    }
}

始终保持折叠的屏幕

需要做两件事:进入屏幕时强制折叠TopAppBar,同时禁用滚动对TopAppBar状态的影响:

// 示例:始终折叠的屏幕
val currentRoute = // 获取当前路由(比如通过NavController.currentBackStackEntryAsState)

// 路由切换时强制折叠TopAppBar
LaunchedEffect(currentRoute) {
    if (currentRoute == "YourAlwaysCollapsedScreenRoute") {
        topAppBarState.collapse()
    }
}

// 自定义无操作的滚动行为,避免屏幕滚动触发TopAppBar状态变化
val noOpScrollBehavior = object : TopAppBarScrollBehavior {
    override val state: TopAppBarState = topAppBarState
    override val nestedScrollConnection: NestedScrollConnection = object : NestedScrollConnection {}
    override var isScrollInProgress: Boolean = false
}

// 屏幕内容使用无操作滚动行为
Box(
    modifier = Modifier.nestedScroll(noOpScrollBehavior.nestedScrollConnection)
) {
    // 你的屏幕内容,比如表单、详情页等
    Text("始终折叠的屏幕内容", modifier = Modifier.padding(16.dp))
}

如果你的始终折叠屏幕不需要滚动交互,也可以更简单:直接不绑定nestedScroll修饰符,同时在进入屏幕时强制折叠:

LaunchedEffect(Unit) {
    topAppBarState.collapse()
}

Column(modifier = Modifier.fillMaxSize()) {
    // 屏幕内容
}

关键注意点

  • 必须确保所有屏幕共享同一个topAppBarState实例,否则状态无法统一控制;
  • 路由切换时的LaunchedEffect要监听当前路由,确保每次进入目标屏幕都能触发折叠;
  • 禁用滚动行为的核心是切断屏幕滚动与TopAppBar状态的关联,避免误触展开。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:17:34