產品新訊

Jetpack Compose 2026 年 4 月發布版本的新功能

5 分鐘閱讀
Meghan Mehta
Android 開發人員服務代表

Jetpack Compose 2026 年 4 月版已於今天發布穩定版。這個版本包含核心 Compose 模組 1.11 版 (請參閱完整的 BoM 對應)、共用元素偵錯工具、觸控板事件等。我們也提供幾項實驗性 API,歡迎試用並提供意見。

如要使用今天的發布版本,請將 Compose BOM 版本升級至:

implementation(platform("androidx.compose:compose-bom:2026.04.01"))

Compose 1.11.0 的變更項目

測試中的協同程式執行

我們即將推出重大更新,調整 Compose 處理測試時間的方式。如 Compose 1.10 公告所述,在選擇加入期過後,系統現在會預設使用第 2 版測試 API,並淘汰第 1 版 API。主要變更在於預設測試調度工具的轉移。第 1 版 API 依賴 UnconfinedTestDispatcher,會立即執行協同程式,而第 2 版 API 則使用 StandardTestDispatcher。也就是說,在測試中啟動協同程式時,系統會將其加入佇列,並在虛擬時鐘前進後才執行。

這能更貼近實際環境,有效找出競爭條件,大幅提升測試套件的穩定性,減少片狀現象。

為確保測試符合標準協同程式行為,並避免日後發生相容性問題,強烈建議您遷移測試套件。如需 API 對應和常見修正方式,請參閱完整的遷移指南

共用元素改善項目和動畫工具

我們也為共用元素和 Modifier.animatedBounds 新增了一些實用的視覺化偵錯工具。現在您可以清楚瞭解幕後發生的情況,例如目標界線、動畫軌跡和找到的相符項目數量,因此更容易找出轉場效果可能無法如預期運作的原因。如要使用新工具,只要以 LookaheadAnimationVisualDebugging 可組合函式包圍 SharedTransitionLayout 即可。

LookaheadAnimationVisualDebugging(
    overlayColor = Color(0x4AE91E63),
    isEnabled = true,
    multipleMatchesColor = Color.Green,
    isShowKeylabelEnabled = false,
    unmatchedElementColor = Color.Red,
) {
    SharedTransitionLayout {
        CompositionLocalProvider(
            LocalSharedTransitionScope provides this,
        ) {
            // your content
        }
    }
}

觸控板事件

我們已改進 Compose 對觸控板的支援,包括筆電內建觸控板、平板電腦可拆卸式觸控板,以及外部/虛擬觸控板。現在,基本的觸控板事件通常會視為 PointerType.Mouse 事件,讓滑鼠和觸控板行為更符合使用者預期。先前,這些觸控板事件會被解讀為 PointerType.Touch 的虛擬觸控螢幕手指,導致使用者體驗混淆。舉例來說,使用觸控板按一下並拖曳會捲動畫面,而不是選取內容。在最新版 Compose 中,我們變更了這些事件的指標類型,因此使用觸控板點選及拖曳時,系統不會再捲動畫面。

我們也支援平台自 API 34 起可辨識的複雜觸控板手勢,包括雙指滑動雙指撥動Modifier.scrollableModifier.transformable 等元件會自動辨識這些手勢,以便在觸控板上提供更優質的體驗。

這些變更可改善內建元件的觸控板行為,包括移除多餘的觸控容錯、提供更直覺的拖曳起始手勢、在文字欄位中選取雙擊和三擊,以及在文字欄位中提供桌面樣式的內容選單。

如要測試觸控板行為,可以使用新的測試 API performTrackpadInput,,驗證應用程式搭配觸控板使用時的行為。如果您有自訂手勢偵測工具,請驗證各種輸入類型 (包括觸控螢幕、滑鼠、觸控板和觸控筆) 的行為,並確保支援滑鼠滾輪和觸控板手勢。

beforeAndAfter.webp

組合主機預設值 (Compose 執行階段)

我們導入了 HostDefaultProviderLocalHostDefaultProviderHostDefaultKeyViewTreeHostDefaultKey,可透過 compose-runtime 直接提供主機層級的服務。這樣一來,程式庫就不必依附於 compose-ui 進行查閱,進一步支援 Kotlin Multiplatform。如要將這些值連結至組合樹狀結構,程式庫作者可以使用 compositionLocalWithHostDefaultOf 建立 CompositionLocal,從主機解析預設值。

預覽包裝

Android Studio 自訂預覽是一項新功能,可讓您準確定義 Compose 預覽內容的顯示方式。

導入 PreviewWrapperProvider 介面並套用新的 @PreviewWrapper 註解,即可輕鬆插入自訂邏輯,例如套用特定 Theme。註解可套用至以 @Composable@Preview@MultiPreview 註解的函式,提供適用於預先發布功能的通用解決方案,且易於使用,可大幅減少重複的程式碼。

class ThemeWrapper: PreviewWrapper {
    @Composable
    override fun Wrap(content: @Composable (() -> Unit)) {
        JetsnackTheme {
            content()
        }
    }
}

@PreviewWrapperProvider(ThemeWrapper::class)
@Preview
@Composable
private fun ButtonPreview() {
    // JetsnackTheme in effect
    Button(onClick = {}) {
        Text(text = "Demo")
    }
}

淘汰與移除

  • 如 Compose 1.10 網誌文章所述,我們將淘汰 Modifier.onFirstVisible()。這個名稱經常造成誤解,尤其是在捲動期間會多次觸發的延遲版面配置中。建議您改用 Modifier.onVisibilityChanged(),以便根據特定用途需求,更精確地手動追蹤可見度狀態。
  • 由於系統現在預設一律啟用 TextFields 的 D-Pad 導覽功能,因此已移除 ComposeFoundationFlags.isTextFieldDpadNavigationEnabled 標記。這項新行為可確保遊戲手把或電視遙控器的 D-pad 事件會先將游標移往指定方向,游標必須移到文字結尾,焦點才能移至其他元素。

即將推出的 API

在即將推出的 Compose 1.12.0 版本中,compileSdk 將升級至 compileSdk 37,AGP 9 和所有依附於 Compose 的應用程式和程式庫都會繼承這項需求。建議您使用最新發布的版本,因為 Compose 的目標是盡快採用新的 compileSdks,讓您存取最新的 Android 功能。請務必參閱這份說明文件,進一步瞭解不同 API 級別支援的 AGP 版本。

Compose 1.11.0 推出下列 API 做為 @Experimental,歡迎您在應用程式中探索這些 API,並提供意見回饋。請注意,@Experimental APIs僅供早期評估和提供意見回饋,日後可能會大幅變更或移除。

樣式 (實驗功能)

我們將推出新的實驗性基礎 API,用於設定樣式。Style API 是自訂元件視覺元素的新範例,傳統上這類作業都是透過修飾符執行。這個 API 會公開一組可設定樣式的標準屬性,並提供簡單的狀態式樣式和動畫轉場效果,讓您輕鬆進行更深入的自訂作業。我們已透過這項新 API 獲得令人期待的成效優勢。我們計畫在 Style API 穩定後,採用 Material 元件中的樣式。

以下是覆寫按下狀態樣式背景的基本範例:

@Composable
fun LoginButton(modifier: Modifier = Modifier) {
    Button(
        onClick = {
            // Login logic
        },
        modifier = modifier,
        style = {
            background(
                Brush.linearGradient(
                    listOf(lightPurple, lightBlue)
                )
            )
            width(75.dp)
            height(50.dp)
            textAlign(TextAlign.Center)
            externalPadding(16.dp)

            pressed {
                background(
                    Brush.linearGradient(
                        listOf(Color.Magenta, Color.Red)
                    )
                )
            }
        }
    ){
        Text(
            text = "Login",
        )
    }
}
styles.webp

請參閱說明文件,並在這裡回報任何錯誤。

MediaQuery (實驗功能)

新的 mediaQuery API 提供宣告式且高效能的方式,可讓您根據環境調整 UI。它會將複雜的資訊擷取作業抽象化為 UiMediaScope 內的簡單條件,確保只有在必要時才會重組。

支援各種環境信號,包括鍵盤類型和指標精確度等裝置功能,以及視窗大小和姿勢等情境狀態,可打造深度回應式體驗。derivedMediaQuery 內建效能,可處理高頻率更新,且能夠覆寫範圍,因此在不同硬體設定中測試及預覽時,都能順暢進行。先前如要存取特定裝置屬性 (例如裝置是否處於桌面模式),您需要編寫大量樣板:

@Composable
fun isTabletopPosture(
    context: Context = LocalContext.current
): Boolean {
    val windowLayoutInfo by
        WindowInfoTracker
            .getOrCreate(context)
            .windowLayoutInfo(context)
            .collectAsStateWithLifecycle(null)

    return windowLayoutInfo.displayFeatures.any { displayFeature ->
        displayFeature is FoldingFeature &&
            displayFeature.state == FoldingFeature.State.HALF_OPENED &&
            displayFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
    }
}

@Composable
fun VideoPlayer() {
    if(isTabletopPosture()) {
        TabletopLayout()
    } else {
        FlatLayout()
    }
}

現在,您可以使用 UIMediaQuery 新增 mediaQuery 語法,查詢裝置屬性,例如裝置是否處於桌面模式:

@OptIn(ExperimentalMediaQueryApi::class)
@Composable
fun VideoPlayer() {
    if (mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop }) {
        TabletopLayout()
    } else {
        FlatLayout()
    }
}

請參閱說明文件,並在這裡回報任何錯誤。

格線 (實驗版)

Grid 是功能強大的全新 API,可在 Jetpack Compose 中建構複雜的二維版面配置。RowColumn 非常適合線性設計,而 Grid 則可提供畫面層級架構和複雜元件所需的結構控制項,且不會造成可捲動清單的負擔。Grid 可讓您使用軌道、間隙和儲存格定義版面配置,並提供熟悉的尺寸選項,例如 Dp、百分比、內建內容大小和彈性「Fr」單位。

@OptIn(ExperimentalGridApi::class)
@Composable
fun GridExample() {
    Grid(
        config = {
            repeat(4) { column(0.25f) }
            repeat(2) { row(0.5f) }
            gap(16.dp)
        }
    ) {
        Card1(modifier = Modifier.gridItem(rowSpan = 2)
        Card2(modifier = Modifier.gridItem(colmnSpan = 3)
        Card3(modifier = Modifier.gridItem(columnSpan = 2)
        Card4()
    }
}

您可以自動放置項目,也可以明確將項目跨越多個資料列和欄,以提高精確度。最棒的是,這個版面配置具有高度適應性,您可以動態重新設定格線軌和跨度,因應裝置狀態 (例如桌面模式或螢幕方向變更),確保 UI 在各種板型規格上都能呈現最佳效果。

Grid.gif

請參閱說明文件,並在這裡回報任何錯誤。

FlexBox (實驗版)

FlexBox 是專為高效能自適應 UI 設計的版面配置容器。並根據可用容器尺寸管理項目大小和空間分配。可處理複雜的工作,例如項目換行 (wrap) 和多軸對齊 (justifyContent, alignItems, alignContent)。項目可放大 (grow) 或縮小 (shrink) 來填滿容器。

@OptIn(ExperimentalFlexBoxApi::class)
fun FlexBoxWrapping(){
    FlexBox(
        config = {
            wrap(FlexWrap.Wrap)
            gap(8.dp)
        }
    ) {
        RedRoundedBox()
        BlueRoundedBox()
        GreenRoundedBox(modifier = Modifier.width(350.dp).flex { grow(1.0f) })
        OrangeRoundedBox(modifier = Modifier.width(200.dp).flex { grow(0.7f) })
        PinkRoundedBox(modifier = Modifier.width(200.dp).flex { grow(0.3f) })
    }
}
AnimationGif.gif

請參閱說明文件,並在這裡回報任何錯誤。

新的 SlotTable 實作方式 (實驗版)

我們推出了新的 SlotTable 實作方式,但這個版本預設會停用這項功能。SlotTable 是 Compose 執行階段用來追蹤組合階層狀態、追蹤失效/重組、儲存記憶值,以及在執行階段追蹤組合所有中繼資料的內部資料結構。這項新實作方式旨在提升效能,特別是隨機編輯作業。

如要試用新版 SlotTable,請啟用 ComposeRuntimeFlags.isLinkBufferComposerEnabled。 

立即開始編寫程式!

Jetpack Compose 推出許多令人期待的新 API,而且還會持續推出更多 API,現在正是遷移至 Jetpack Compose 的好時機。一如往常,我們很重視您的意見回饋和功能要求 (尤其是針對仍在開發中的 @Experimental 功能),請在這裡提出。祝編寫愉快!

撰寫者:

繼續閱讀