Jetpack Compose April 2026: Nhẹ nhàng update nhưng “chất” hơn hẳn
Có gì mới trong bản phát hành Jetpack Compose tháng 4 năm 2026?
Bản phát hành Jetpack Compose tháng 04/2026 hiện đã ổn định (stable). Phiên bản này bao gồm Compose module lõi bản 1.11, các công cụ gỡ lỗi phần tử dùng chung (shared element), cải tiến sự kiện trackpad (bàn di chuột), cùng nhiều cập nhật khác. Google cũng ra mắt một số API thử nghiệm (experimental) mới rất đáng để trải nghiệm.
Để sử dụng bản phát hành này, hãy nâng cấp Compose BOM của bạn lên phiên bản:
implementation(platform("androidx.compose:compose-bom:2026.04.01"))
Dưới đây là chi tiết các thay đổi trong Compose 1.11.0:
Các thay đổi chính trong Compose 1.11.0
Thực thi Coroutine trong kiểm thử (Testing)
Google mang đến một bản cập nhật lớn về cách Compose xử lý thời gian (timing) trong testing. Các API testing v2 nay đã trở thành mặc định, và các API v1 đã bị gỡ bỏ (deprecated).
Sự thay đổi quan trọng nhất nằm ở test dispatcher. Nếu như v1 dựa trên UnconfinedTestDispatcher (thực thi coroutine ngay lập tức), thì v2 sử dụng StandardTestDispatcher. Điều này có nghĩa là khi một coroutine được khởi chạy trong bài test, nó sẽ được đưa vào hàng đợi và không thực thi cho đến khi đồng hồ ảo (virtual clock) được tịnh tiến.
Điều này mô phỏng sát hơn với môi trường thực tế (production), giúp phát hiện các lỗi "race condition" và làm cho bộ test của bạn bớt "đứt gánh" (flaky) hơn.
Cải tiến Shared element và công cụ gỡ lỗi animation

Google bổ sung các công cụ gỡ lỗi trực quan cho shared elements và Modifier.animatedBounds. Bạn nay đã có thể thấy chính xác những gì đang diễn ra phía dưới hệ thống (như ranh giới đích, quỹ đạo hoạt ảnh...).
Chỉ cần bọc SharedTransitionLayout của bạn bằng composable LookaheadAnimationVisualDebugging:
LookaheadAnimationVisualDebugging(
overlayColor = Color(0x4AE91E63),
isEnabled = true,
multipleMatchesColor = Color.Green,
isShowKeylabelEnabled = false,
unmatchedElementColor = Color.Red,
) {
SharedTransitionLayout {
CompositionLocalProvider(
LocalSharedTransitionScope provides this,
) {
// Nội dung của bạn
}
}
}
Sự kiện Trackpad
Compose đã nâng cấp khả năng hỗ trợ các loại trackpad (bàn di chuột tích hợp trên laptop, trackpad rời cho tablet...). Các sự kiện trackpad cơ bản nay sẽ được coi là sự kiện PointerType.Mouse thay vì PointerType.Touch như trước đây (điều từng gây ra trải nghiệm khó hiểu, ví dụ như nhấp và kéo thả trên trackpad lại bị nhầm thành cuộn).
Các cử chỉ phức tạp của trackpad (như vuốt/chụm 2 ngón tay) đã được hỗ trợ tốt hơn bởi các thành phần như Modifier.scrollable và Modifier.transformable. Compose cũng bổ sung các API kiểm thử mới như performTrackpadInput để bạn dễ dàng test thao tác trackpad.
| before | after |
|---|---|
![]() |
![]() |
Các hàm Preview wrapper
Tính năng Custom previews mới của Android Studio cho phép bạn định nghĩa chính xác cách hiển thị nội dung của một Compose preview. Bằng cách implement interface PreviewWrapperProvider và sử dụng annotation @PreviewWrapper, bạn có thể dễ dàng inject các logic tùy chỉnh (ví dụ như áp dụng một Theme cụ thể) để giảm thiểu code lặp lại.
Gỡ bỏ (Deprecations)
- Gỡ bỏ
Modifier.onFirstVisible()(do hay gây hiểu nhầm trong lazy layout). Khuyến nghị chuyển sangModifier.onVisibilityChanged(). - Xóa bỏ cờ
ComposeFoundationFlags.isTextFieldDpadNavigationEnabledvì điều hướng D-pad cho TextFields hiện đã được bật mặc định.
##Các API sắp ra mắt & Thử nghiệm (Experimental)
Trong bản cập nhật 1.12.0 sắp tới, compileSdk sẽ được nâng cấp lên 37 (yêu cầu AGP 9). Trong khi đó, bản 1.11.0 hiện tại đã bổ sung một số API @Experimental cực kỳ thú vị:
1. Styles (Thử nghiệm)
Một API nền tảng mới để tạo kiểu dáng (styling) thay cho modifier truyền thống. Nó cung cấp một bộ thuộc tính có thể định kiểu với logic dựa trên trạng thái (state-based) và các hiệu ứng chuyển đổi animation dễ dàng, đồng thời mang lại hiệu suất tốt hơn.
@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",
)
}
}

2. MediaQuery (Thử nghiệm)
Cung cấp một cách khai báo (declarative) và tối ưu để thay đổi UI dựa trên môi trường thiết bị. Thay vì phải viết nhiều boilerplate code để lấy thông tin trạng thái gập của màn hình, bạn có thể dễ dàng dùng cú pháp mediaQuery:
Before
@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()
}
}
Now
@OptIn(ExperimentalMediaQueryApi::class)
@Composable
fun VideoPlayer() {
if (mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop }) {
TabletopLayout()
} else {
FlatLayout()
}
}
3. Grid (Thử nghiệm)
Một API mạnh mẽ cho các layout 2D phức tạp. Trong khi Row và Column tốt cho cấu trúc tuyến tính, thì Grid mang lại sự kiểm soát theo cấu trúc hàng/cột (tracks, gaps, cells) với các đơn vị như Dp, %, nội dung nội tại, và tỷ lệ phần "Fr" linh hoạt mà không gặp gánh nặng như danh sách cuộn (scrollable list).
@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()
}
}

4. FlexBox (Thử nghiệm)
Một layout container được thiết kế để tạo ra các giao diện thích ứng với hiệu năng cao. Nó quản lý kích thước phần tử và phân phối không gian dư thừa cực tốt, bao gồm cả các tính năng xướng dòng (wrap) và tự động kéo dãn/thu nhỏ phần tử (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) })
}
}

5. Khai báo SlotTable mới (Thử nghiệm)
Một bản triển khai mới của SlotTable (cấu trúc dữ liệu nội bộ mà Compose runtime dùng để theo dõi state) được ra mắt nhằm tăng hiệu năng cho các thao tác chỉnh sửa ngẫu nhiên. (Kích hoạt qua cờ ComposeRuntimeFlags.isLinkBufferComposerEnabled).
Nguồn tham khảo: Android Developers Blog
All rights reserved

