Ürün Haberleri

Jetpack Compose Aralık 2025 sürümündeki yenilikler

Okuma süresi 6 dakika
Nick Butcher'ın profilini görüntüleyin
Nick Butcher Ürün Yöneticisi

Bugün, Jetpack Compose Aralık 2025 sürümü kararlı sürüm olarak yayınlandı. Bu sürümde, temel Compose modüllerinin 1.10 sürümü ve Material 3'ün 1.4 sürümü (tam BOM eşlemesini inceleyin) yer alır. Ayrıca yeni özellikler ve önemli performans iyileştirmeleri içerir.

Bugünkü sürümü kullanmak için Compose BOM sürümünüzü 2025.12.00 olarak yükseltin:

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

Performans iyileştirmeleri

Uygulamanızın çalışma zamanı performansının sizin ve kullanıcılarınız için çok önemli olduğunu biliyoruz. Bu nedenle, performans Compose ekibinin önceliklerinden biri olmuştur. Bu sürümde çeşitli iyileştirmeler yapıldı. En son sürüme yükselterek tüm bu iyileştirmelerden yararlanabilirsiniz. Dahili kaydırma karşılaştırmalarımız, Compose'un artık Görünümler'i kullanırken göreceğiniz performansla eşleştiğini gösteriyor:

janky.png

Farklı Compose sürümlerinde Views ve Jetpack Compose'u karşılaştıran kaydırma performansı karşılaştırması

Lazy prefetch'te duraklatılabilir kompozisyon

Lazy prefetch'te duraklatılabilir oluşturma özelliği artık varsayılan olarak etkinleştirildi. Bu, Compose çalışma zamanının işleri planlama şeklini temelden değiştiren bir değişikliktir ve yoğun kullanıcı arayüzü iş yükleri sırasında duraklamayı önemli ölçüde azaltmak için tasarlanmıştır.

Daha önce, bir beste başlatıldığında tamamlanana kadar çalıştırılması gerekiyordu. Bir kompozisyon karmaşıksa bu durum, ana iş parçacığını tek bir kare süresinden daha uzun süre engelleyerek kullanıcı arayüzünün donmasına neden olabilir. Duraklatılabilir kompozisyon sayesinde, çalışma zamanı artık süresi doluyorsa çalışmasını "duraklatabilir" ve bir sonraki karede çalışmaya devam edebilir. Bu özellik, kareleri önceden hazırlamak için geç yükleme düzeni önceden getirme ile birlikte kullanıldığında özellikle etkilidir. Compose 1.9'da kullanıma sunulan Lazy düzen CacheWindow API'leri, daha fazla içeriği önceden getirmek ve çok daha sorunsuz bir kullanıcı arayüzü performansı elde etmek için duraklatılabilir kompozisyondan yararlanmak için harika bir yoldur.

pausable.gif

Lazy prefetch ile birlikte duraklatılabilir kompozisyon, takılmayı azaltmaya yardımcı olur

Ayrıca Modifier.onPlaced, Modifier.onVisibilityChanged ve diğer değiştirici uygulamalarında iyileştirmeler yaparak performansı başka yerlerde de optimize ettik. Oluşturma özelliğinin performansını artırmaya yönelik yatırımlarımıza devam edeceğiz.

Yeni özellikler

Elde tutma

Compose, farklı yaşam döngülerinde durumu tutmak ve yönetmek için çeşitli API'ler sunar. Örneğin, remember, kompozisyonlar arasında durumu kalıcı hale getirir ve rememberSavable/rememberSerializable, etkinlik veya süreç yeniden oluşturma arasında durumu kalıcı hale getirir. retain, bu API'ler arasında yer alan yeni bir API'dir. Değerleri, yapılandırma değişiklikleri arasında seri hale getirilmeden ancak işlem sonlandırma arasında kalıcı hale getirmenizi sağlar. retain durumunuzu serileştirmediğinden, lambda ifadeleri, akışlar ve bit eşlemler gibi kolayca serileştirilemeyen büyük nesneler gibi nesneleri kalıcı hale getirebilirsiniz. Örneğin, medya oynatmayı yapılandırma değişikliği nedeniyle kesintiye uğramamasını sağlamak için retain kullanarak bir medya oynatıcıyı (ör. ExoPlayer) yönetebilirsiniz.

@Composable

fun MediaPlayer() {

    val applicationContext = LocalContext.current.applicationContext

    val exoPlayer = retain { ExoPlayer.Builder(applicationContext).apply { ... }.build() }

    ...

}

Bu özelliğin tasarımını etkileyen ve katkıda bulunan AndroidDev topluluğuna (özellikle Circuit ekibine) teşekkür ederiz.

Malzeme 1.4

material3 kitaplığının 1.4.0 sürümüne çeşitli yeni bileşenler ve geliştirmeler eklenmiştir:

centered-hero-carousel.webp

Yatay ortalanmış ana banner kaydırma bandı

material3 kitaplığının alfa sürümlerinde Material 3 Expressive API'lerinin geliştirilmeye devam ettiğini unutmayın. Daha fazla bilgi edinmek için şu yakın tarihli konuşmayı izleyin:

Yeni animasyon özellikleri

Paylaşılan öğe animasyonlarını özelleştirmeye yönelik güncellemeler de dahil olmak üzere animasyon API'lerimizi genişletmeye devam ediyoruz.

Dinamik paylaşılan öğeler

Varsayılan olarak, sharedElement() ve sharedBounds() animasyonları

Hedef durumda eşleşen bir anahtar bulunduğunda düzen değişir. Ancak, gezinme yönü veya mevcut kullanıcı arayüzü durumu gibi belirli koşullara göre bu animasyonu dinamik olarak devre dışı bırakmak isteyebilirsiniz.

Paylaşılan öğe geçişinin gerçekleşip gerçekleşmeyeceğini kontrol etmek için artık SharedContentConfig öğesini rememberSharedContentState()'ye iletmek üzere özelleştirebilirsiniz. isEnabled özelliği, paylaşılan öğenin etkin olup olmadığını belirler.

SharedTransitionLayout {

        val transition = updateTransition(currentState)

        transition.AnimatedContent { targetState ->

            // Create the configuration that depends on state changing.

            fun animationConfig() : SharedTransitionScope.SharedContentConfig {

                return object : SharedTransitionScope.SharedContentConfig {

                    override val SharedTransitionScope.SharedContentState.isEnabled: Boolean

                        get() =

                            // determine whether to perform a shared element transition

                }

            }

}

Daha fazla bilgi için belgeleri inceleyin.

Modifier.skipToLookaheadPosition()

Bu sürümde, paylaşılan öğe animasyonları gerçekleştirilirken composable'ın son konumunu koruyan yeni bir değiştirici (Modifier.skipToLookaheadPosition()) eklendi. Bu, Androidify örneğinde kameranın kademeli olarak gösterilmesinde görüldüğü gibi "gösterme" türü animasyon gibi geçişlerin yapılmasını sağlar. Daha fazla bilgi için buradaki video ipucuna göz atın: 

Paylaşılan öğe geçişlerinde ilk hız

Bu sürümde, paylaşılan öğe geçişine başlangıç hızı (ör. hareketten) iletmenize olanak tanıyan yeni bir paylaşılan öğe geçişi API'si (prepareTransitionWithInitialVelocity) eklenmiştir:

Modifier.fillMaxSize()

    .draggable2D(

        rememberDraggable2DState { offset += it },

        onDragStopped = { velocity ->

            // Set up the initial velocity for the upcoming shared element

            // transition.

            sharedContentStateForDraggableCat

                ?.prepareTransitionWithInitialVelocity(velocity)

            showDetails = false

        },

    )
fling-shared.gif

Bir hareketten gelen ilk hızla başlayan paylaşılan öğe geçişi

Örtülü geçişler

EnterTransition ve ExitTransition, AnimatedVisibility/AnimatedContent composable'ın nasıl görüneceğini veya kaybolacağını tanımlar. Yeni deneysel örtü seçeneği, içeriği örtmek veya karartmak için bir renk belirtmenize olanak tanır. Örneğin, içeriğin üzerine yarı opak siyah bir katman ekleyip katmanı yavaş yavaş görünür veya görünmez hale getirebilirsiniz:

veil_2.gif

Örtülü animasyonlu içerik: Animasyon sırasında ızgara içeriğinin üzerinde yarı opak bir örtü (veya tül) olduğunu unutmayın.

AnimatedContent(

    targetState = page,

    modifier = Modifier.fillMaxSize().weight(1f),

    transitionSpec = {

        if (targetState > initialState) {

            (slideInHorizontally { it } togetherWith

                    slideOutHorizontally { -it / 2 } + veilOut(targetColor = veilColor))

        } else {

            slideInHorizontally { -it / 2 } +

                    unveilIn(initialColor = veilColor) togetherWith slideOutHorizontally { it }

        }

    },

) { targetPage ->

    ...

}

Yapılacak değişiklikler

Modifier.onFirstVisible işlevinin desteğinin sonlandırılması

Compose 1.9'da Modifier.onVisibilityChanged ve Modifier.onFirstVisible özellikleri kullanıma sunuldu. Geri bildiriminizi inceledikten sonra, Modifier.onFirstVisible sözleşmesinin kesin olarak yerine getirilemediği anlaşıldı. Özellikle de bir öğe ilk kez görünür olduğunda. Örneğin, Lazy düzen, görüntü alanının dışına kaydırılan öğeleri kaldırabilir ve tekrar görüntü alanına kaydırılırsa bunları yeniden oluşturabilir. Bu durumda, yeni oluşturulan bir öğe olduğundan onFirstVisible geri arama tekrar tetiklenir. onFirstVisible içeren, daha önce ziyaret edilmiş bir ekrana geri dönüldüğünde de benzer bir davranışla karşılaşılır. Bu nedenle, sonraki Compose sürümünde (1.11) bu değiştiricinin desteğini sonlandırmaya ve onVisibilityChanged'ye geçmenizi önermeye karar verdik. Daha fazla bilgi için belgeleri inceleyin.

Testlerde coroutine gönderme

Testlerdeki eş yordam dağıtımını değiştirerek testlerin güvenilirliğini artırmayı ve daha fazla sorunu tespit etmeyi planlıyoruz. Şu anda testlerde UnconfinedTestDispatcher kullanılmaktadır.Bu, üretim davranışından farklıdır. Örneğin, efektler sıraya alınmak yerine hemen çalıştırılabilir. Gelecekteki bir sürümde, üretim davranışlarıyla eşleşmek için varsayılan olarak StandardTestDispatcher kullanan yeni bir API'yi kullanıma sunmayı planlıyoruz. Yeni davranışı 1.10 sürümünde hemen deneyebilirsiniz:

@get:Rule // also createAndroidComposeRule, createEmptyComposeRule

val rule = createComposeRule(effectContext = StandardTestDispatcher())

StandardTestDispatcher kullanıldığında görevler sıraya alınır. Bu nedenle, composeTestRule.waitForIdle() veya composeTestRule.runOnIdle() gibi senkronizasyon mekanizmalarını kullanmanız gerekir. Testinizde runTest kullanılıyorsa runTest ve Oluşturma kuralınızın senkronizasyon için aynı StandardTestDispatcher örneğini kullandığından emin olmanız gerekir.

// 1. Create a SINGLE dispatcher instance

val testDispatcher = StandardTestDispatcher()



// 2. Pass it to your Compose rule

@get:Rule

val composeRule = createComposeRule(effectContext = testDispatcher)



@Test

// 3. Pass the *SAME INSTANCE* to runTest

fun myTest() = runTest(testDispatcher) {

    composeRule.setContent { /* ... */ }

}

Araçlar

Harika API'ler harika araçları hak eder ve Android Studio, Compose geliştiricileri için yakın zamanda eklenen çeşitli özelliklere sahiptir:

Bu araçların nasıl çalıştığını görmek için aşağıdaki son demoyu izleyin:

Happy Composing

Güzel ve zengin kullanıcı arayüzleri oluşturmak için ihtiyacınız olan API'leri ve araçları sunmak amacıyla Jetpack Compose'a yatırım yapmaya devam ediyoruz. Görüşlerinize değer veriyoruz. Bu nedenle, bu değişikliklerle ilgili geri bildirimlerinizi veya bir sonraki adımda görmek istediklerinizi lütfen sorun izleyicimizde paylaşın.

Okumaya devam et