Ü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üle
Meghan Mehta Geliştirici Destekçisi, 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şlemesine bakın), paylaşılan öğe hata ayıklama araçları, dokunmatik yüzey etkinlikleri ve daha fazlası yer alır. 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 etkinleştirme döneminin ardından, v2 test API'leri artık varsayılan olarak kullanılmaktadır ve v1 API'leri kullanımdan kaldırılmıştır. En önemli değişiklik, varsayılan test dağıtıcısındaki değişikliktir. v1 API'leri, eş yordamları hemen yürüten UnconfinedTestDispatcher'yi kullanırken v2 API'leri StandardTestDispatcher'yi kullanır. Bu, testlerinizde bir eş yordam başlatıldığında artık sıraya alındığı ve sanal saat ilerletilene kadar yürütülmediği anlamına gelir.

Bu sayede üretim koşulları daha iyi taklit edilir, yarışma durumları etkili bir şekilde ortadan kaldırılır ve test paketiniz çok daha sağlam ve daha az kararsız hale gelir.

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ş rehberimizi inceleyin.

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ı ekledik. Artık hedef sınırları, animasyon yörüngeleri ve kaç eşleşme bulunduğu gibi arka planda neler olduğunu tam olarak görebilirsiniz. Böylece, bir geçişin neden beklendiği gibi davranmadığını tespit etmek çok daha kolay olur. Yeni araçları kullanmak için SharedTransitionLayout'unuzu LookaheadAnimationVisualDebugging composable ile sarmalamanız 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ü bilgisayarlardaki yerleşik dokunmatik yüzeyler, tabletler için takılabilir 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 dokunmatik yüzey etkinlikleri, PointerType.Touch için sahte dokunmatik ekran parmakları olarak yorumlanıyordu. Bu da kafa karıştırıcı kullanıcı deneyimlerine yol açıyordu. Örneğin, dokunmatik yüzeyle tıklayıp sürüklediğinizde seçim yapmak yerine kaydırma işlemi gerçekleştirilir. 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 dokunmatik yüzey hareketleri için de destek ekledik. Bunlar arasında iki parmakla kaydırma ve sıkıştırma hareketleri yer alır. 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 dokunmatik yüzeylerin davranışını iyileştirir. Gereksiz dokunma hassasiyeti kaldırılır, daha sezgisel bir sürükle ve bırak başlangıç hareketi, metin alanlarında çift tıklama ve üç tıklama ile seçim ve metin alanlarında masaüstü tarzı bağlam menüleri sunulur.

Dokunmatik yüzey davranışını test etmek için performTrackpadInput, ile yeni test API'leri kullanıma sunuldu. 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

Composition ana makine 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 arama için compose-ui'e bağlı olması gerekmez ve Kotlin Multiplatform daha iyi desteklenir. Kitaplık yazarları, bu değerleri oluşturma 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, bir Oluştur önizlemesinin içeriğinin tam olarak nasıl görüntüleneceğini tanımlamanıza olanak tanıyan yeni bir özelliktir.

PreviewWrapperProvider arayüzünü uygulayarak ve yeni @PreviewWrapper ek açıklamasını kullanarak belirli bir Theme uygulama gibi özel mantıklar ekleyebilirsiniz. Ek açıklama, @Composable ve @Preview veya @MultiPreview ile ek açıklama eklenmiş bir işleve uygulanabilir. Böylece, özellik önizlemelerinde çalışan ve tekrarlanan kodu önemli ölçüde azaltan genel, 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")
    }
}

Kullanımdan kaldırmalar ve kaldırmalar

  • Compose 1.10 blog yayınında duyurulduğu üzere Modifier.onFirstVisible() desteğini sonlandırıyoruz. Adı, özellikle kaydırma sırasında birden çok kez tetikleneceği geçici düzenlerde genellikle yanlış anlaşılmalara yol açıyordu. Kullanım alanınızın özel gereksinimlerine göre uyarlanmış görünürlük durumlarının daha hassas bir şekilde manuel olarak izlenmesine olanak tanıyan Modifier.onVisibilityChanged()'e 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 sürümlerini hemen kullanıma sunmayı amaçladığından, yayınlanan en son sürümleri takip etmenizi ö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 sunuluyor. Uygulamalarınızda bu API'leri denerken geri bildirimlerinizi duymayı sabırsızlıkla bekliyoruz. @Experimental APIs, erken değerlendirme ve geri bildirim için sunulur. Gelecekteki sürümlerde önemli değişikliklere uğrayabilir veya kaldırılabilir.

Stiller (Deneysel)

Stil oluşturma için yeni bir deneysel temel API'yi kullanıma sunuyoruz. Style API, bileşenlerin görsel öğelerini özelleştirmek için yeni bir paradigmadır. Bu işlem, geleneksel olarak değiştiricilerle gerçekleştirilir. 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 açıklayıcı ve performanslı bir yöntem sunar. Karmaşık bilgiyi getirme işlemlerini UiMediaScope içindeki basit koşullara dönüştürerek yeniden oluşturma işleminin yalnızca gerektiğinde 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 çevresel sinyaller için destek sunarak son derece duyarlı deneyimler oluşturabilirsiniz. Yüksek frekanslı güncellemeleri işlemek için performans derivedMediaQuery ile entegre edilmiştir. Kapsamları geçersiz kılma özelliği ise donanım yapılandırmaları genelinde test ve önizleme işlemlerini sorunsuz hale getirir. 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 idealdir. Grid ise 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, parçalar, boşluklar ve hücreler kullanarak düzeninizi tanımlamanıza olanak tanır. Dp, yüzdeler, içsel 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 hassas bir şekilde birden fazla satır ve sütuna yayabilirsiniz. En önemlisi de son derece uyarlanabilir olmasıdır. 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ırabilir, böylece kullanıcı arayüzünüzün tüm form faktörlerinde mükemmel görünmesini sağlayabilirsiniz.

Grid.gif

Belgeleri inceleyin 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)

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

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

Kodlamaya hemen 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 çalışmalar!

Yazan:
Okumaya devam et