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.scrollable 和 Modifier.transformable 等元件會自動辨識這些手勢,以便在觸控板上提供更優質的體驗。
這些變更可改善內建元件的觸控板行為,包括移除多餘的觸控容錯、提供更直覺的拖曳起始手勢、在文字欄位中選取雙擊和三擊,以及在文字欄位中提供桌面樣式的內容選單。
如要測試觸控板行為,可以使用新的測試 API performTrackpadInput,,驗證應用程式搭配觸控板使用時的行為。如果您有自訂手勢偵測工具,請驗證各種輸入類型 (包括觸控螢幕、滑鼠、觸控板和觸控筆) 的行為,並確保支援滑鼠滾輪和觸控板手勢。
組合主機預設值 (Compose 執行階段)
我們導入了 HostDefaultProvider、LocalHostDefaultProvider、HostDefaultKey 和 ViewTreeHostDefaultKey,可透過 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", ) } }
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() } }
您可以自動放置項目,也可以明確將項目跨越多個資料列和欄,以提高精確度。最棒的是,這個版面配置具有高度適應性,您可以動態重新設定格線軌和跨度,因應裝置狀態 (例如桌面模式或螢幕方向變更),確保 UI 在各種板型規格上都能呈現最佳效果。
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 實作方式,但這個版本預設會停用這項功能。SlotTable 是 Compose 執行階段用來追蹤組合階層狀態、追蹤失效/重組、儲存記憶值,以及在執行階段追蹤組合所有中繼資料的內部資料結構。這項新實作方式旨在提升效能,特別是隨機編輯作業。
如要試用新版 SlotTable,請啟用 ComposeRuntimeFlags.isLinkBufferComposerEnabled。
立即開始編寫程式!
Jetpack Compose 推出許多令人期待的新 API,而且還會持續推出更多 API,現在正是遷移至 Jetpack Compose 的好時機。一如往常,我們很重視您的意見回饋和功能要求 (尤其是針對仍在開發中的 @Experimental 功能),請在這裡提出。祝編寫愉快!
繼續閱讀
-
產品新訊
Android Studio Panda 4 現已推出穩定版,可用於正式工作環境。這個版本推出「規劃模式」、「下一個編輯預測」等功能,讓您更輕鬆地建構高品質 Android 應用程式。
Matt Dyor • 閱讀時間:5 分鐘
-
產品新訊
如果您是 Android 開發人員,想在應用程式中導入創新的 AI 功能,我們最近推出了強大的新更新。
Thomas Ezan • 3 分鐘可讀完
-
產品新訊
Android 17 已推出 Beta 版 4,這是這個發布週期中最後一個預定推出的 Beta 版,也是應用程式相容性和平台穩定性的重要里程碑。
Daniel Galpin • 4 分鐘可讀完
隨時掌握最新消息
每週透過電子郵件接收最新的 Android 開發洞察資訊。