Ürün Haberleri

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

Okuma süresi 6 dakika
Nick Butcher
Ürün Yöneticisi

Jetpack Compose Aralık 2025 sürümü bugün 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şlemesine bakın) 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'a 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 ne kadar önemli olduğunu biliyoruz. Bu nedenle, performans Compose ekibinin önceliklerinden biri olmuştur. Bu sürümde birçok iyileştirme 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 yeniliktir. Ağır 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 bileşim 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

Duraklatılabilir kompozisyon, Lazy prefetch ile birlikte 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 getirmeden 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.

1.4. Materyal

material3 kitaplığının 1.4.0 sürümüne bir dizi yeni bileşen ve geliştirme eklenmiştir:

centered-hero-carousel.webp

Yatay olarak ortalanmış ana banner kaydırma alanı

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 son 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 bağlı olarak 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 iletilen şekilde ö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, ortak öğ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öster" 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 kullanıma sunuldu. Geri bildiriminizi inceledikten sonra, Modifier.onFirstVisible sözleşmesinin deterministik 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şturulmuş 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 karar verdik ve onVisibilityChanged'ye geçmenizi öneririz. Daha fazla bilgi için belgeleri inceleyin.

Testlerde coroutine gönderme

Testlerdeki kararlı olmama durumunu iyileştirmek ve daha fazla sorunu yakalamak için testlerdeki coroutine dağıtımını değiştirmeyi planlıyoruz. Şu anda testlerde üretim davranışından farklı olan UnconfinedTestDispatcher kullanılmaktadı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 Compose kuralınızın senkronizasyon için aynı StandardTestDispatcher örneğini paylaştığı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 üzere Jetpack Compose'a yatırım yapmaya devam ediyoruz. Görüşlerinize değer veriyoruz. Bu nedenle, bu değişiklikler veya bir sonraki adımda görmek istediğiniz yenilikler hakkındaki geri bildirimlerinizi lütfen sorun izleyicimizde paylaşın.

Okumaya devam edin