今天,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 中宣布的選擇加入期結束後,v2 測試 API 現在是預設的,而 v1 API 已被棄用。關鍵變化在於預設測試調度程序的變更。v1 API 依賴 UnconfinedTestDispatcher,它會立即執行協程,而 v2 API 則使用 StandardTestDispatcher。這意味著,當在測試中啟動協程時,它現在會被放入佇列,直到虛擬時鐘向前移動才會執行。
這樣可以更好地模擬生產條件,有效地消除競爭條件,使你的測試套件更加穩健,穩定性更高。
為了確保您的測試符合標準協程行為,並避免將來出現相容性問題,我們強烈建議您遷移測試套件。查看我們全面的遷移指南,瞭解 API 映射和常見修復方法。
共享元素改進與動畫工具
我們還為共享元素和 Modifier.animatedBounds 添加了一些方便的可視化調試工具。現在您可以清楚地看到底層發生的情況——例如目標邊界、動畫軌跡以及找到的匹配項數量——從而更容易發現過渡效果為何可能未按預期運行。要使用新工具,只需將 SharedTransitionLayout 以 LookaheadAnimationVisualDebugging 可組合元素包裹起來即可。
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.scrollable 和 Modifier.transformable 等組件自動識別,以便更好地與觸控板配合使用。
這些變化改善了內建組件中觸控板的行為,消除了冗餘的觸控延遲,增加了更直觀的拖放起始手勢,支援在文字欄位中雙擊和三擊選擇,以及在文字欄位中提供桌面風格的上下文功能表。
為了測試觸控板行為,我們提供了新的測試 API,即 performTrackpadInput,,它允許驗證您的應用程式在使用觸控板時的行為。如果您有自訂手勢偵測器,請驗證跨輸入類型(包括觸控螢幕、滑鼠、觸控板和手寫筆)的行為,並確保支援滑鼠滾輪和觸控板手勢。
Compose 主機預設值(Compose 運行時)
我們引入了 HostDefaultProvider、LocalHostDefaultProvider、HostDefaultKey 和 ViewTreeHostDefaultKey,以便透過 compose-runtime 直接提供主機級服務。這樣就無需庫依賴 compose-ui 進行查找,從而更好地支援 Kotlin 多平台。為了將這些值與組成樹關聯起來,庫作者可以使用compositionLocalWithHostDefaultOf創建一個CompositionLocal解析主機上的預設值。
預覽包裝器
Android Studio 自訂預覽 是一項新功能,可讓您精確定義 Compose 預覽內容的顯示方式。
透過實作 PreviewWrapperProvider 介面並套用新的 @PreviewWrapper 註解,您可以輕鬆注入自訂邏輯,例如套用特定的 Theme。此註解可應用於具有 @Composable 和 @Preview 或 @MultiPreview 註解的函數,提供通用、易於使用的解決方案,適用於預覽功能,並顯著減少重複程式碼。
class ThemeWrapper: PreviewWrapperProvider { @Composable override fun Wrap(content: @Composable (() -> Unit)) { JetsnackTheme { content() } } } @PreviewWrapper(ThemeWrapper::class) @Preview @Composable private fun ButtonPreview() { // JetsnackTheme in effect Button(onClick = {}) { Text(text = "Demo") } }
棄用和移除
- 如 Compose 1.10 網誌文章所述,我們將淘汰
Modifier.onFirstVisible()。這個名稱經常造成誤解,尤其是在延遲版面配置中,捲動時會多次觸發。建議您改用Modifier.onVisibilityChanged(),根據特定用途需求,手動追蹤可見度狀態。 - 由於系統現在預設一律啟用 D-pad 導覽功能,因此已移除
ComposeFoundationFlags.isTextFieldDpadNavigationEnabled標記。TextFields這項新行為可確保遊戲手把或電視遙控器的 D-pad 事件會先將游標移至指定方向,游標必須移到文字結尾,焦點才能移至其他元素。
即將推出的 API
在即將推出的 Compose 1.12.0 版本中,compileSdk 將升級至 compileSdk 37,AGP 9 和所有依附於 Compose 的應用程式和程式庫都會繼承這項需求。建議您隨時更新至最新發布的版本,因為 Compose 的目標是迅速採用新版 compileSdks,讓您存取最新的 Android 功能。請務必查看這份說明文件,進一步瞭解不同 API 級別支援的 AGP 版本。
Compose 1.11.0 推出下列 API@Experimental,歡迎您在應用程式中試用,並提供意見回饋。請注意,@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", ) } }
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 中建立複雜的二維佈局。雖然 Row 和 Column 非常適合線性設計,但 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() } }
您可以自動放置項目,也可以明確地將項目跨越多行和多列以達到精確放置的目的。最重要的是,它具有高度自適應性——您可以動態地重新配置網格軌道和跨度,以響應設備狀態(如桌面模式或方向變化),從而確保您的用戶界面在各種外形尺寸下都看起來很棒。
查看文件,並在此提交任何錯誤。
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) }) } }
新的槽位表實現(實驗性)
我們引入了 SlotTable 的新實現,該實現在此版本中預設為停用。SlotTable 是 Compose 運行時用來追蹤組合層次結構的狀態、追蹤失效/重新組合、儲存記住的值以及在執行時間追蹤組合的所有元資料的內部資料結構。這項新實現旨在提高性能,主要針對隨機編輯。
若要嘗試新的 SlotTable,請啟用 ComposeRuntimeFlags.isLinkBufferComposerEnabled。
今天就開始寫程式碼吧!
Jetpack Compose 中新增了許多令人興奮的 API,未來還會推出更多,現在是使用它們的最佳時機。遷移到 Jetpack Compose 。一如既往,我們重視您的回饋和功能請求(尤其是仍在開發中的@Experimental功能)—請在此處提交。祝編寫愉快!
-
產品最新消息這是 Android Studio Quail 的最終穩定版。Android Studio 的新功能可協助您有效率地建構優質 AI 應用程式。
Amman Asfaw • 5 分鐘小故事 -
產品最新消息維護健全的 Android 生態系統是我們共同的承諾,每個應用程式和遊戲都扮演著重要角色。
Raghavendra Hareesh Pottamsetty • 4 分鐘小故事 -
產品最新消息在 Google Play,使用者安全與開發人員成功是相輔相成的。我們發現,搭載 AI 生成功能的應用程式持續成長。事實上,在應用程式中加入生成式 AI,是發揮無限創意的絕佳方式。
Ron Aquino • 4 分鐘小故事
每週透過電子郵件接收最新的 Android 開發洞察資訊。