產品新訊

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 現在已成為預設 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 功能),請在這裡提出。祝編寫愉快!

撰寫者:

繼續閱讀