SearchBar:折叠输入框与展开结果层 · AndroidX 源码指南
AAndroidX 源码指南
M3E 设计系统
M3E 设计系统 · androidx.compose.material3

SearchBar:折叠输入框与展开结果层1.5.0-alpha25

使用 SearchBarState 连接折叠、全屏和 Docked 模式,并处理滚动行为与返回操作。

最后更新 2026-08-01

SearchBar 结构

新 API 是一套状态机

源码提供 SearchBarStaterememberSearchBarState() 和多个展开容器:FullScreen、Contained、Docked、WithGap。state.progress 表示折叠和展开之间的进度,targetValue 表示目标状态。

val state = rememberSearchBarState()

SearchBar(
    state = state,
    inputField = { /* SearchBarDefaults.InputField */ },
)

具体展示结果时,根据布局选择 ExpandedFullScreenSearchBarExpandedDockedSearchBar,不要自己在输入框下面绝对定位一个列表冒充完整 SearchBar。

FullScreen 与 Docked

  • FullScreen:移动设备、结果成为当前主要任务。
  • Docked:大屏或上下文仍需保持可见。
  • WithGap:展开层与输入框之间需要视觉间隔。

滚动与返回

源码另外提供 SearchBarScrollState 和 scroll behavior modifier。展开搜索还必须正确响应系统返回:优先收起搜索,而不是直接离开整个页面。

复制即用

折叠输入框 + Docked 展开结果层:

import androidx.compose.material3.ExpandedDockedSearchBar
import androidx.compose.material3.SearchBar
import androidx.compose.material3.SearchBarDefaults
import androidx.compose.material3.Text
import androidx.compose.material3.rememberSearchBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember

@Composable
fun DockedSearch() {
    val state = rememberSearchBarState()
    val textFieldState = rememberTextFieldState()

    SearchBar(
        state = state,
        inputField = {
            SearchBarDefaults.InputField(
                textFieldState = textFieldState,
                searchBarState = state,
                onSearch = {},
                placeholder = { Text("搜索") },
            )
        },
    )

    if (state.targetValue) {
        ExpandedDockedSearchBar(
            state = state,
            inputField = {
                SearchBarDefaults.InputField(
                    textFieldState = textFieldState,
                    searchBarState = state,
                    onSearch = {},
                )
            },
        ) {
            Text("结果列表")
        }
    }
}

rememberTextFieldState 来自 androidx.compose.foundation.text.input;展开后要正确处理系统返回(先收起再离开页面)。