Ürün Haberleri

Jetpack Compose Nisan 2026 sürümündeki yenilikler

Okuma süresi: 6 dk.
Meghan Mehta'nın profilini görüntüleme
Meghan Mehta Developer Advocate, Android

Jetpack Compose Nisan 2026 sürümü artık kararlı. Bu sürümde temel Compose modüllerinin 1.11 sürümü (tam BOM eşlemesini inceleyin), paylaşılan öğe hata ayıklama araçları, dokunmatik yüzey etkinlikleri ve daha fazlası yer alıyor. Ayrıca, denemenizi ve geri bildirimde bulunmanızı istediğimiz birkaç deneysel API'miz de var.

Bugünkü sürümü kullanmak için Compose BOM sürümünüzü şu sürüme yükseltin:

implementation(platform("androidx.compose:compose-bom:2026.04.01"))

Compose 1.11.0 sürümündeki değişiklikler

Testlerde eş yordam yürütme

Compose'un test zamanlamasını işleme biçiminde önemli bir güncelleme yapıyoruz. Compose 1.10'da duyurulan erken erişim döneminin ardından v2 test API'leri artık varsayılan olarak kullanılıyor ve v1 API'lerinin desteği sonlandırıldı. Temel değişiklik, varsayılan test dağıtıcısında yapılan değişikliktir. v1 API'leri, eş yordamları hemen yürüten UnconfinedTestDispatcher'ye dayanırken v2 API'leri StandardTestDispatcher'yi kullanır. Bu, testlerinizde bir coroutine başlatıldığında artık sıraya alındığı ve sanal saat ilerletilene kadar yürütülmediği anlamına gelir.

Bu, üretim koşullarını daha iyi taklit ederek yarışma durumlarını etkili bir şekilde temizler ve test paketinizi önemli ölçüde daha sağlam ve daha az kararsız hale getirir.

Testlerinizin standart eş yordam davranışıyla uyumlu olmasını sağlamak ve gelecekteki uyumluluk sorunlarını önlemek için test paketinizi taşımanızı önemle tavsiye ederiz. API eşlemeleri ve yaygın düzeltmeler için kapsamlı geçiş rehberimize göz atın.

Paylaşılan öğe iyileştirmeleri ve animasyon araçları

Ayrıca, paylaşılan öğeler ve Modifier.animatedBounds için bazı kullanışlı görsel hata ayıklama araçları da ekledik. Artık hedef sınırları, animasyon yörüngeleri ve kaç eşleşme bulunduğu gibi arka planda tam olarak ne olduğunu görebilirsiniz. Bu sayede, bir geçişin neden beklendiği gibi davranmadığını tespit etmek çok daha kolay hale gelir. Yeni aracı kullanmak için SharedTransitionLayout'unuzu LookaheadAnimationVisualDebugging composable ile çevrelemeniz yeterlidir. 

LookaheadAnimationVisualDebugging(
    overlayColor = Color(0x4AE91E63),
    isEnabled = true,
    multipleMatchesColor = Color.Green,
    isShowKeylabelEnabled = false,
    unmatchedElementColor = Color.Red,
) {
    SharedTransitionLayout {
        CompositionLocalProvider(
            LocalSharedTransitionScope provides this,
        ) {
            // your content
        }
    }
}

Dokunmatik yüzey etkinlikleri

Dizüstü bilgisayarlara yerleşik dokunmatik yüzeyler, tabletlere takılabilen dokunmatik yüzeyler veya harici/sanal dokunmatik yüzeyler gibi dokunmatik yüzeyler için Compose desteğini yeniledik. Temel dokunmatik yüzey etkinlikleri artık genellikle PointerType.Mouse etkinlikleri olarak kabul edilecek. Böylece fare ve dokunmatik yüzey davranışı, kullanıcı beklentilerini daha iyi karşılayacak şekilde uyumlu hale getirilecek. Daha önce bu trackpad etkinlikleri PointerType.Touch'nın sahte dokunmatik ekran parmakları olarak yorumlanıyordu ve bu durum kafa karıştırıcı kullanıcı deneyimlerine yol açıyordu. Örneğin, dokunmatik yüzeyle tıklayıp sürüklemek seçmek yerine kaydırma işlemi yapar. Compose'un en son sürümünde bu etkinliklerin işaretçi türü değiştirildi. Bu sayede, dokunmatik yüzeyle tıklayıp sürükleme işlemi artık kaydırma yapmayacak.

Ayrıca, API 34'ten itibaren platform tarafından tanınan daha karmaşık trackpad hareketleri için destek ekledik. Bu hareketler arasında iki parmakla kaydırma ve parmakla yakınlaştırma yer alıyor. Bu hareketler, dokunmatik yüzeylerde daha iyi performans göstermesi için Modifier.scrollable ve Modifier.transformable gibi bileşenler tarafından otomatik olarak tanınır.

Bu değişiklikler, yerleşik bileşenlerdeki izleme panellerinin davranışını iyileştirir. Gereksiz dokunma boşluğu kaldırılır, daha sezgisel bir sürükle ve bırakma başlangıç hareketi, metin alanlarında çift tıklama ve üç kez tıklama ile seçim ve metin alanlarında masaüstü tarzı bağlam menüleri eklenir.

Dokunmatik yüzey davranışını test etmek için performTrackpadInput, ile yeni test API'leri vardır. Bu API'ler, uygulamalarınızın dokunmatik yüzeyle kullanıldığında nasıl davrandığını doğrulamanıza olanak tanır. Özel hareket algılayıcılarınız varsa dokunmatik ekranlar, fareler, dokunmatik yüzeyler ve ekran kalemleri dahil olmak üzere giriş türleri genelinde davranışı doğrulayın ve fare kaydırma tekerlekleri ile dokunmatik yüzey hareketlerinin desteklendiğinden emin olun.

beforeAndAfter.webp

Bileşim ana makinesi varsayılanları (Compose çalışma zamanı)

Ana makine düzeyindeki hizmetleri doğrudan compose-runtime üzerinden sağlamak için HostDefaultProvider, LocalHostDefaultProvider, HostDefaultKey ve ViewTreeHostDefaultKey'i kullanıma sunduk. Bu sayede kitaplıkların aramalar için compose-ui'ya bağımlı olması gerekmez ve Kotlin Multiplatform daha iyi desteklenir. Kitaplık yazarları, bu değerleri kompozisyon ağacına bağlamak için compositionLocalWithHostDefaultOf kullanarak ana makinedeki varsayılanları çözen bir CompositionLocal oluşturabilir.

Sarmalayıcıları önizleme

Android Studio özel önizlemeleri, Compose önizlemesinin içeriklerinin tam olarak nasıl görüntüleneceğini tanımlamanıza olanak tanıyan yeni bir özelliktir.

PreviewWrapperProvider arayüzünü uygulayıp yeni @PreviewWrapper ek açıklamasını kullanarak belirli bir Theme uygulama gibi özel mantığı kolayca ekleyebilirsiniz. Açıklama, @Composable ve @Preview veya @MultiPreview ile açıklama eklenmiş bir işleve uygulanabilir. Bu sayede, özellik önizlemelerinde çalışan ve tekrarlanan kodu önemli ölçüde azaltan genel ve kullanımı kolay bir çözüm sunulur.

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")
    }
}

Desteği sonlandırma ve kaldırma

  • Compose 1.10 blog yayınında duyurulduğu gibi Modifier.onFirstVisible() desteğini sonlandırıyoruz. Adı, özellikle kaydırma sırasında birden çok kez tetiklendiği tembel düzenlerde sıklıkla yanlış anlaşılmalara yol açıyordu. Görünürlük durumlarının, belirli kullanım alanı gereksinimlerinize göre daha hassas şekilde manuel olarak izlenmesine olanak tanıyan Modifier.onVisibilityChanged()'ye geçmenizi öneririz.
  • TextFields için d-pad ile gezinme artık varsayılan olarak her zaman etkin olduğundan ComposeFoundationFlags.isTextFieldDpadNavigationEnabled işareti kaldırıldı. Yeni davranış, oyun kumandası veya TV uzaktan kumandasındaki d-pad etkinliklerinin önce imleci belirtilen yönde hareket ettirmesini sağlar. Odak, yalnızca imleç metnin sonuna ulaştığında başka bir öğeye geçebilir.

Yakında kullanıma sunulacak API'ler

Yakında çıkacak Compose 1.12.0 sürümünde compileSdk, AGP 9 ile compileSdk 37 sürümüne yükseltilecek ve Compose'a bağlı tüm uygulamalar ile kitaplıklar bu koşulu devralacak. Compose, en yeni Android özelliklerine erişim sağlamak için yeni compileSdks'yi hızlı bir şekilde kullanmayı hedeflediğinden, yayınlanan en son sürümleri kullanmanızı öneririz. Farklı API seviyeleri için hangi AGP sürümünün desteklendiği hakkında daha fazla bilgi edinmek üzere buradaki belgelere göz atın. 

Compose 1.11.0'da aşağıdaki API'ler @Experimental olarak kullanıma sunulmuştur. Uygulamalarınızda bu API'leri keşfederken geri bildirimlerinizi bekliyoruz. @Experimental APIs, erken değerlendirme ve geri bildirim için sunulur ve gelecekteki sürümlerde önemli değişikliklere uğrayabilir veya kaldırılabilir.

Stiller (Deneysel)

Stil için yeni bir deneysel temel API sunuyoruz. Style API, bileşenlerin görsel öğelerini özelleştirmek için kullanılan yeni bir yöntemdir. Bu işlem, geleneksel olarak değiştiricilerle yapılırdı. Bu API, basit duruma dayalı stil ve animasyonlu geçişler içeren standart bir stil verilebilir özellikler grubu sunarak daha ayrıntılı ve kolay özelleştirme imkanı sunmak için tasarlanmıştır. Bu yeni API ile şimdiden umut verici performans avantajları elde ediyoruz. Style API kararlı hale geldiğinde Material bileşenlerinde stilleri kullanmayı planlıyoruz.

Basılı durum stili arka planını geçersiz kılmaya dair temel bir örnek:

@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

Belgeleri inceleyin ve hataları buradan bildirin.

MediaQuery (Deneysel)

Yeni mediaQuery API, kullanıcı arayüzünüzü ortamına uyarlamak için bildirim temelli ve yüksek performanslı bir yol sunar. Karmaşık bilgiyi getirmeyi UiMediaScope içindeki basit koşullara indirgeyerek yalnızca gerektiğinde yeniden oluşturma yapılmasını sağlar.

Klavye türleri ve işaretçi hassasiyeti gibi cihaz özelliklerinden pencere boyutu ve duruş gibi bağlamsal durumlara kadar çok çeşitli ortam sinyalleri desteği sayesinde son derece duyarlı deneyimler oluşturabilirsiniz. Yüksek sıklıkta güncellemeleri işlemek için derivedMediaQuery ile performans yerleşiktir. Kapsamları geçersiz kılma özelliği sayesinde, donanım yapılandırmaları arasında test ve önizleme sorunsuz bir şekilde yapılabilir. Daha önce, belirli cihaz özelliklerine erişmek için (ör. cihazın masaüstü modunda olup olmadığı) çok sayıda standart kod yazmanız gerekiyordu: 

@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()
    }
}

Artık UIMediaQuery ile mediaQuery söz dizimini ekleyerek cihaz özelliklerini (ör. cihazın masaüstü modunda olup olmadığı) sorgulayabilirsiniz:

@OptIn(ExperimentalMediaQueryApi::class)
@Composable
fun VideoPlayer() {
    if (mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop }) {
        TabletopLayout()
    } else {
        FlatLayout()
    }
}

Belgeleri inceleyin ve hataları buradan bildirin.

Izgara (Deneysel)

Grid, Jetpack Compose'da karmaşık, iki boyutlu düzenler oluşturmak için kullanabileceğiniz güçlü ve yeni bir API'dir. Row ve Column doğrusal tasarımlar için ideal olsa da Grid, kaydırılabilir liste ek yükü olmadan ekran düzeyinde mimari ve karmaşık bileşenler için gereken yapısal kontrolü sağlar. Grid, düzeninizi parçalar, boşluklar ve hücreler kullanarak tanımlamanıza olanak tanır. Bu sayede Dp, yüzdeler, doğal içerik boyutları ve esnek "Fr" birimleri gibi tanıdık boyutlandırma seçenekleri sunar. 

@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()
    }
}

Öğeleri otomatik olarak yerleştirebilir veya hassasiyet için birden fazla satır ve sütuna yayabilirsiniz. En önemlisi, bu düzen son derece uyarlanabilir. Izgara parçalarınızı ve aralıklarınızı, masaüstü modu veya yön değişiklikleri gibi cihaz durumlarına yanıt verecek şekilde dinamik olarak yeniden yapılandırabilirsiniz. Böylece kullanıcı arayüzünüz tüm form faktörlerinde harika görünür.

Grid.gif

Belgelere göz atın ve hataları buradan bildirin. 

FlexBox (Deneysel)

FlexBox, yüksek performanslı ve uyarlanabilir kullanıcı arayüzleri için tasarlanmış bir düzen kapsayıcısıdır. Öğe boyutlandırmayı ve alan dağılımını, kullanılabilir kapsayıcı boyutlarına göre yönetir.  Kaydırma (wrap) ve öğelerin çok eksenli hizalanması (justifyContent, alignItems, alignContent) gibi karmaşık görevleri yerine getirir. Öğelerin kapsayıcıyı dolduracak şekilde büyümesine (grow) veya küçülmesine (shrink) olanak tanır. 

@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

Belgeleri inceleyin ve hataları buradan bildirin.

Yeni SlotTable uygulaması (Deneysel)

Bu sürümde varsayılan olarak devre dışı bırakılan SlotTable için yeni bir uygulama kullanıma sunduk. SlotTable, Compose çalışma zamanının beste hiyerarşinizin durumunu izlemek, geçersiz kılmaları/yeniden oluşturmaları takip etmek, hatırlanan değerleri depolamak ve çalışma zamanında besteye ait tüm meta verileri izlemek için kullandığı dahili veri yapısıdır. Bu yeni uygulama, performansı (özellikle rastgele düzenlemelerle ilgili) artırmak için tasarlanmıştır.

Yeni SlotTable özelliğini denemek için ComposeRuntimeFlags.isLinkBufferComposerEnabled'ı etkinleştirin. 

Hemen kodlamaya başlayın.

Jetpack Compose'da heyecan verici birçok yeni API'nin kullanıma sunulması ve daha fazlasının da yolda olmasıyla birlikte, Jetpack Compose'a geçmek için en uygun zaman geldi.  Her zaman olduğu gibi, geri bildirimlerinize ve özellik isteklerinize (özellikle henüz geliştirme aşamasında olan @Experimental özellikleriyle ilgili olanlara) değer veriyoruz. Lütfen bunları buradan gönderin. İyi yazmalar!

Yazan:
Okumaya devam et