Jetpack Compose 4 月 26 日發布的版本已是穩定版。這個版本包含核心 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。現在,您可以清楚查看幕後運作情形,例如目標邊界、動畫軌跡和找到的相符項目數量,輕鬆找出轉場效果不如預期的原因。如要使用新工具,只要在 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 等元件會自動辨識這些手勢,以便在觸控板上提供更優質的操作體驗。
這些變更可改善觸控板在內建元件中的行為,包括移除多餘的觸控斜率、更直覺的拖曳起始手勢、在文字欄位中按兩下和按三下選取,以及在文字欄位中顯示電腦樣式的內容選單。
如要測試觸控板行為,可以使用 performTrackpadInput, 的新測試 API,驗證應用程式在搭配觸控板使用時的行為。如果您有自訂手勢偵測工具,請驗證各種輸入類型的行為,包括觸控螢幕、滑鼠、觸控板和觸控筆,並確保支援滑鼠滾輪和觸控板手勢。
組合主機預設值 (Compose 執行階段)
我們推出了 HostDefaultProvider、LocalHostDefaultProvider、HostDefaultKey 和 ViewTreeHostDefaultKey,可直接透過 compose-runtime 提供主機層級服務。這樣一來,程式庫就不必依賴 compose-ui 進行查詢,能更妥善支援 Kotlin Multiplatform。如要將這些值連結至組合結構樹,程式庫作者可以使用 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(),以便根據特定用途需求,更精確地手動追蹤瀏覽權限狀態。 ComposeFoundationFlags.isTextFieldDpadNavigationEnabled旗標已移除,因為TextFields的 D-pad 導覽功能現在預設一律啟用。新行為可確保遊戲手把或電視遙控器的 D-pad 事件,會先將游標移往指定方向。游標移到文字結尾後,焦點才能移到其他元素。
即將推出的 API
在即將推出的 Compose 1.12.0 版本中,compileSdk 將升級至 compileSdk 37,並採用 AGP 9,所有依賴 Compose 的應用程式和程式庫都會繼承這項規定。Compose 的目標是迅速採用新的 compileSdks,以便提供最新的 Android 功能,因此建議您隨時更新至最新發布版本。請務必查看這份說明文件,進一步瞭解不同 API 級別支援的 AGP 版本。
Compose 1.11.0 推出下列 @Experimental API,歡迎您在應用程式中試用,並提供意見回饋。請注意,@Experimental APIs僅供早期評估和意見回饋,在日後版本中可能會有重大變更或移除。
樣式 (實驗功能)
我們將推出新的實驗性基礎 API,用於設定樣式。Style 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,未來還會推出更多,現在正是遷移至 Jetpack Compose 的最佳時機。一如既往,我們十分重視您的意見回饋和功能要求 (尤其是仍在開發中的 @Experimental 功能),歡迎前往這裡提交。祝編寫愉快!
-
產品最新消息今天,我們在 Android 開發人員高峰會上宣布,將廣泛提供多項工具和 API,旨在消除日常摩擦,讓您更靈活地建構出色的 Android 應用程式。
Matthew McCullough • 閱讀時間:4 分鐘 -
產品最新消息Android Studio Rabbit 2 穩定版已推出,可供您在正式環境中使用。此版本包含多項重要功能,可提升開發效率,例如「自備代理」、全新 XR 模擬器功能、LeakCanary 更新、全新代理技能管理工具、AI 程式碼審查等。
Matthew Warner • 閱讀時間:3 分鐘 -
產品最新消息如果應用程式指定即將推出的 Android 版本,將無法再透過 WRITE_CONTACTS 權限直接寫入聯絡人資料。
Roxanna Aliabadi Walker • 閱讀時間:6 分鐘
每週透過電子郵件接收 Android 開發人員的最新深入分析。