Android KTX   Android Jetpack'in bir parçasıdır.

Android KTX, Android Jetpack ve diğer Android kitaplıklarına dahil olan bir dizi Kotlin uzantısıdır. KTX uzantıları, Jetpack, Android platformu ve diğer API'ler için kısa ve doğal Kotlin sağlar. Bu uzantılar, bunu yapmak için aşağıdakiler de dahil olmak üzere çeşitli Kotlin dil özelliklerinden yararlanır:

  • Uzantı işlevleri
  • Uzantı özellikleri
  • Lambdalar
  • Adlandırılmış parametreler
  • Parametre varsayılan değerleri
  • Eş yordamlar

Örneğin, SharedPreferences ile çalışırken tercih verilerinde değişiklik yapabilmek için düzenleyici oluşturmanız gerekir. Ayrıca, düzenlemeyi tamamladığınızda aşağıdaki örnekte gösterildiği gibi bu değişiklikleri uygulamanız veya kaydetmeniz gerekir:

sharedPreferences
        .edit()  // create an Editor
        .putBoolean("key", value)
        .apply() // write to disk asynchronously

Kotlin lambdaları bu kullanım alanı için mükemmel bir seçimdir. Düzenleyici oluşturulduktan sonra çalıştırılacak bir kod bloğu ileterek, kodun çalıştırılmasına izin verip ardından SharedPreferences API'nin değişiklikleri atomik olarak uygulamasını sağlayarak daha kısa bir yaklaşım benimsemenize olanak tanır.

Android KTX Core işlevlerinden birine örnek olarak, SharedPreferences öğesine bir düzenleme işlevi ekleyen SharedPreferences.edit işlevini burada bulabilirsiniz. Bu işlev, ilk bağımsız değişkeni olarak değişikliklerin kaydedilip kaydedilmeyeceğini veya uygulanıp uygulanmayacağını belirten isteğe bağlı bir boolean işareti alır. Ayrıca, SharedPreferences düzenleyicisinde lambda biçiminde gerçekleştirilecek bir işlem de alır.

// SharedPreferences.edit extension function signature from Android KTX - Core
// inline fun SharedPreferences.edit(
//         commit: Boolean = false,
//         action: SharedPreferences.Editor.() -> Unit)

// Commit a new value asynchronously
sharedPreferences.edit { putBoolean("key", value) }

// Commit a new value synchronously
sharedPreferences.edit(commit = true) { putBoolean("key", value) }

Arayan kişi, değişiklikleri kaydetmeyi veya uygulamayı seçebilir. action lambda, SharedPreferences.Editor üzerinde imzasıyla belirtildiği gibi Unit döndüren anonim bir uzantı işlevidir. Bu nedenle, blok içinde doğrudan SharedPreferences.Editor üzerinde çalışabilirsiniz.

Son olarak, SharedPreferences.edit() imzası inline anahtar kelimesini içerir. Bu anahtar kelime, Kotlin derleyicisine işlev her kullanıldığında işlevin derlenmiş bayt kodunu kopyalayıp yapıştırması (veya satır içi olarak yerleştirmesi) gerektiğini söyler. Bu sayede, işlev her çağrıldığında her action için yeni bir sınıf oluşturma yükü önlenir.

Lambda kullanarak kod aktarma, geçersiz kılınabilen makul varsayılanlar uygulama ve bu davranışları inline uzantı işlevlerini kullanarak mevcut API'lere ekleme, Android KTX kitaplığı tarafından sağlanan geliştirmelere özgüdür.

Projenizde Android KTX'yi kullanma

Android KTX'yi kullanmaya başlamak için projenizin build.gradle dosyasına aşağıdaki bağımlılığı ekleyin:

Groovy

repositories {
    google()
}

Kotlin

repositories {
    google()
}

AndroidX Modülleri

Android KTX, her biri bir veya daha fazla paket içeren modüller halinde düzenlenir.

Uygulamanızın build.gradle dosyasına her modül yapısını içeren bir bağımlılık eklemeniz gerekir. Sürüm numarasını yapıya eklemeyi unutmayın. En son sürüm numaralarını, her yapının bu konunun ilgili bölümünde bulabilirsiniz.

Android KTX, yaygın çerçeve API'leri ve alana özgü çeşitli uzantılar için Kotlin uzantıları sağlayan tek çekirdekli bir modül içerir.

Temel modül hariç tüm KTX modülü yapıları, build.gradle dosyanızdaki temel Java bağımlılığını değiştirir. Örneğin, bir androidx.fragment:fragment bağımlılığını androidx.fragment:fragment-ktx ile değiştirebilirsiniz. Bu söz dizimi, sürümleri daha iyi yönetmenize yardımcı olur ve ek bağımlılık beyanı koşulları eklemez.

Core KTX

Core KTX modülü, Android çerçevesinin bir parçası olan yaygın kitaplıklar için uzantılar sağlar. Bu kitaplıklarda, build.gradle'e eklemeniz gereken Java tabanlı bağımlılık yoktur.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Eski

dependencies {
    implementation "androidx.core:core-ktx:1.13.1"
}

Kotlin

dependencies {
    implementation("androidx.core:core-ktx:1.13.1")
}

Core KTX modülünde bulunan paketlerin listesi aşağıda verilmiştir:

Collection KTX

Koleksiyon uzantıları, Android'in ArrayMap, LongSparseArray, LruCache ve diğerleri gibi bellek tasarruflu koleksiyon kitaplıklarıyla çalışmak için yardımcı işlevler içerir.

Bu modülü kullanmak için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Groovy

dependencies {
    implementation "androidx.collection:collection-ktx:1.4.5"
}

Kotlin

dependencies {
    implementation("androidx.collection:collection-ktx:1.4.5")
}

Koleksiyon uzantıları, aşağıdaki örnekte gösterildiği gibi koleksiyon birleştirme gibi işlemleri basitleştirmek için Kotlin'in operatör aşırı yükleme özelliğinden yararlanır:

// Combine 2 ArraySets into 1.
val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6)

// Combine with numbers to create a new sets.
val newArraySet = combinedArraySet + 7 + 8

Fragment KTX

Fragment KTX modülü, fragment API'yi basitleştirmek için çeşitli uzantılar sağlar.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Eski

dependencies {
    implementation "androidx.fragment:fragment-ktx:1.8.3"
}

Kotlin

dependencies {
    implementation("androidx.fragment:fragment-ktx:1.8.3")
}

Fragment KTX modülüyle, lambdalarla parça işlemlerini basitleştirebilirsiniz. Örneğin:

fragmentManager().commit {
   addToBackStack("...")
   setCustomAnimations(
           R.anim.enter_anim,
           R.anim.exit_anim)
   add(fragment, "...")
}

viewModels ve activityViewModels mülk temsilcilerini kullanarak tek satırda bir ViewModel'e de bağlanabilirsiniz:

// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()

// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()

Yaşam Döngüsü KTX

Yaşam döngüsü KTX, her Lifecycle nesnesi için bir LifecycleScope tanımlar. Bu kapsamda başlatılan tüm coroutine'ler, Lifecycle yok edildiğinde iptal edilir. lifecycle.coroutineScope veya lifecycleOwner.lifecycleScope mülklerini kullanarak Lifecycle öğesinin CoroutineScope özelliğine erişebilirsiniz.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Groovy

dependencies {
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.7"
}

Kotlin

dependencies {
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7")
}

Aşağıdaki örnekte, önceden hesaplanmış metinleri ayarlamak için lifecycleOwner.lifecycleScope işlevinin nasıl kullanılacağı gösterilmektedir:

class MyFragment: Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewLifecycleOwner.lifecycleScope.launch {
            val params = TextViewCompat.getTextMetricsParams(textView)
            val precomputedText = withContext(Dispatchers.Default) {
                PrecomputedTextCompat.create(longTextContent, params)
            }
            TextViewCompat.setPrecomputedText(textView, precomputedText)
        }
    }
}

LiveData KTX

LiveData'yı kullanırken değerleri eşzamansız olarak hesaplamanız gerekebilir. Örneğin, bir kullanıcının tercihlerini alıp kullanıcı arayüzünüze sunmak isteyebilirsiniz. Bu durumlarda LiveData KTX, suspend işlevini çağıran ve sonucu LiveData nesnesi olarak sunan bir liveData oluşturucu işlevi sağlar.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Groovy

dependencies {
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.7"
}

Kotlin

dependencies {
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.7")
}

Aşağıdaki örnekte loadUser(), başka bir yerde tanımlanmış bir askıya alma işlevidir. loadUser() işlevini eşzamansız olarak çağırmak için liveData oluşturucu işlevini, ardından sonucu yayınlamak için emit() işlevini kullanabilirsiniz:

val user: LiveData<User> = liveData {
    val data = database.loadUser() // loadUser is a suspend function.
    emit(data)
}

LiveData ile eş yordamları kullanma hakkında daha fazla bilgi için Kotlin eş yordamlarını mimari bileşenleriyle kullanma başlıklı makaleyi inceleyin.

Gezinme kitaplığının her bileşeninin, API'yi daha kısa ve Kotlin diline uygun olacak şekilde uyarlayan kendi KTX sürümü vardır.

Bu modülleri dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Groovy

dependencies {
    implementation "androidx.navigation:navigation-runtime-ktx:2.8.4"
    implementation "androidx.navigation:navigation-fragment-ktx:2.8.4"
    implementation "androidx.navigation:navigation-ui-ktx:2.8.4"
}

Kotlin

dependencies {
    implementation("androidx.navigation:navigation-runtime-ktx:2.8.4")
    implementation("androidx.navigation:navigation-fragment-ktx:2.8.4")
    implementation("androidx.navigation:navigation-ui-ktx:2.8.4")
}

Aşağıdaki örnekte gösterildiği gibi, hedef bağımsız değişkenlerine erişmek ve hedeflere gitmek için uzantı işlevlerini ve mülk yetkilendirmesini kullanın:

class MyDestination : Fragment() {

    // Type-safe arguments are accessed from the bundle.
    val args by navArgs<MyDestinationArgs>()

    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        view.findViewById<Button>(R.id.next)
            .setOnClickListener {
                // Fragment extension added to retrieve a NavController from
                // any destination.
                findNavController().navigate(R.id.action_to_next_destination)
            }
     }
     ...

}

Palette KTX

Palette KTX modülü, renk paletleriyle çalışmak için doğal Kotlin desteği sunar.

Bu modülü kullanmak için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Eski

dependencies {
    implementation "androidx.palette:palette-ktx:1.0.0"
}

Kotlin

dependencies {
    implementation("androidx.palette:palette-ktx:1.0.0")
}

Örneğin, bir Palette örneğiyle çalışırken get operatörünü ([ ]) kullanarak belirli bir target için selected renk paletini alabilirsiniz:

val palette = Palette.from(bitmap).generate()
val swatch = palette[target]

Reactive Streams KTX

Reactive Streams KTX modülü, bir ReactiveStreams yayıncıdan gözlemlenebilir bir LiveData akışı oluşturmanıza olanak tanır.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Groovy

dependencies {
    implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.7"
}

Kotlin

dependencies {
    implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.7")
}

Örnek olarak, küçük bir kullanıcı listesi içeren bir veritabanı olduğunu varsayalım. Uygulamanızda veritabanını belleğe yükler ve ardından kullanıcı verilerini kullanıcı arayüzünüzde gösterirsiniz. Bunu yapmak için RxJava'yı kullanabilirsiniz. Room Jetpack bileşeni, kullanıcı listesini Flowable olarak alabilir. Bu senaryoda, Rx yayıncı aboneliğini de parçanızın veya etkinliğinizin ömrü boyunca yönetmeniz gerekir.

Ancak LiveDataReactiveStreams ile, aşağıdaki örnekte gösterildiği gibi LiveData'un basitliğiyle çalışırken RxJava ve zengin operatör grubu ile iş planlama özelliklerinden yararlanabilirsiniz:

val fun getUsersLiveData() : LiveData<List<User>> {
    val users: Flowable<List<User>> = dao.findUsers()
    return LiveDataReactiveStreams.fromPublisher(users)
}

Room KTX

Room uzantıları, veritabanı işlemleri için coroutine desteği ekler.

Bu modülü kullanmak için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Eski

dependencies {
    implementation "androidx.room:room-ktx:2.6.1"
}

Kotlin

dependencies {
    implementation("androidx.room:room-ktx:2.6.1")
}

Room'un artık coroutine'leri kullandığı birkaç örnek aşağıda verilmiştir. İlk örnekte, User nesnelerinin listesini döndürmek için bir suspend işlevi kullanılırken ikinci örnekte, User listesini eşzamansız olarak döndürmek için Kotlin'in Flow işlevi kullanılır. Flow kullanırken sorguladığınız tablolardaki değişikliklerden de haberdar edileceğinizi unutmayın.

@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>

@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>

SQLite KTX

SQLite uzantıları, SQL ile ilgili kodu işlemlere sarmalayarak çok sayıda standart koddan kurtulmanızı sağlar.

Bu modülü kullanmak için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Eski

dependencies {
    implementation "androidx.sqlite:sqlite-ktx:2.4.0"
}

Kotlin

dependencies {
    implementation("androidx.sqlite:sqlite-ktx:2.4.0")
}

Veritabanı işlemi gerçekleştirmek için transaction uzantısının kullanıldığı bir örneği aşağıda bulabilirsiniz:

db.transaction {
    // insert data
}

ViewModel KTX

ViewModel KTX kitaplığı, ViewModel'inizden coroutine'leri başlatmayı kolaylaştıran bir viewModelScope() işlevi sağlar. CoroutineScope, Dispatchers.Main'a bağlıdır ve ViewModel temizlendiğinde otomatik olarak iptal edilir. Her ViewModel için yeni bir kapsam oluşturmak yerine viewModelScope() kullanabilirsiniz.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Groovy

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7"
}

Kotlin

dependencies {
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7")
}

Örneğin, aşağıdaki viewModelScope() işlevi, arka plan iş parçacığında ağ isteği gönderen bir iş parçacığı başlatır. Kitaplık, tüm kurulum işlemlerini ve ilgili kapsam temizleme işlemlerini yönetir:

class MainViewModel : ViewModel() {
    // Make a network request without blocking the UI thread
    private fun makeNetworkRequest() {
        // launch a coroutine in viewModelScope
        viewModelScope.launch  {
            remoteApi.slowFetch()
            ...
        }
    }

    // No need to override onCleared()
}

WorkManager KTX

WorkManager KTX, iş parçacığı için birinci sınıf destek sağlar.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Eski

dependencies {
    implementation "androidx.work:work-runtime-ktx:2.9.1"
}

Kotlin

dependencies {
    implementation("androidx.work:work-runtime-ktx:2.9.1")
}

Artık Worker yerine, API'si biraz farklı olan CoroutineWorker'i genişletebilirsiniz. Örneğin, bazı ağ işlemlerini gerçekleştirmek için basit bir CoroutineWorker oluşturmak istiyorsanız aşağıdakileri yapabilirsiniz:

class CoroutineDownloadWorker(context: Context, params: WorkerParameters)
        : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result = coroutineScope {
        val jobs = (0 until 100).map {
            async {
                downloadSynchronously("https://www.google.com")
            }
        }

        // awaitAll will throw an exception if a download fails, which
        // CoroutineWorker will treat as a failure
        jobs.awaitAll()
        Result.success()
    }
}

CoroutineWorker kullanma hakkında daha fazla bilgi için CoroutineWorker'da iş parçacığı oluşturma başlıklı makaleyi inceleyin.

WorkManager KTX, mevcut iş parçacığını askıya almak için Operations ve ListenableFutures işlevlerine de uzantı işlevleri ekler.

enqueue() tarafından döndürülen Operation öğesini askıya alan bir örnek aşağıda verilmiştir:

// Inside of a coroutine...

// Run async operation and suspend until completed.
WorkManager.getInstance()
        .beginWith(longWorkRequest)
        .enqueue().await()

// Resume after work completes...

Diğer KTX modülleri

AndroidX dışındaki ek KTX modüllerini de ekleyebilirsiniz.

Firebase KTX

Android için Firebase SDK'larından bazıları, uygulamanızda Firebase'i kullanırken yerel Kotlin kodu yazmanızı sağlayan Kotlin uzantı kitaplıklarına sahiptir. Daha fazla bilgi için aşağıdaki konulara bakın:

Google Haritalar Platformu KTX

Google Haritalar Platformu Android SDK'ları için uzantı işlevleri, adlandırılmış parametreler ve varsayılan bağımsız değişkenler, yapı bozma bildirimleri ve iş parçacıkları gibi çeşitli Kotlin dil özelliklerinden yararlanmanıza olanak tanıyan KTX uzantıları mevcuttur. Daha fazla bilgi için aşağıdaki konulara bakın:

Play Core KTX

Play Core KTX, Play Core kitaplığındaki SplitInstallManager ve AppUpdateManager işlevlerine uzantı işlevleri ekleyerek tek seferlik istekler için Kotlin coroutine'leri ve durum güncellemelerini izlemek için Flow'u destekler.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Groovy

dependencies {
    implementation "com.google.android.play:core-ktx:1.8.1"
}

Kotlin

dependencies {
    implementation("com.google.android.play:core-ktx:1.8.1")
}

Durum izleme Flow örneğini aşağıda görebilirsiniz:

// Inside of a coroutine...

// Request in-app update status updates.
manager.requestUpdateFlow().collect { updateResult ->
    when (updateResult) {
        is AppUpdateResult.Available -> TODO()
        is AppUpdateResult.InProgress -> TODO()
        is AppUpdateResult.Downloaded -> TODO()
        AppUpdateResult.NotAvailable -> TODO()
    }
}

Daha fazla bilgi

Android KTX hakkında daha fazla bilgi edinmek için DevBytes videosunu izleyin.

Sorun bildirmek veya özellik önerisinde bulunmak için Android KTX sorun izleyicisini kullanın.