Android KTX   Bagian dari Android Jetpack.

Android KTX adalah seperangkat ekstensi Kotlin yang disertakan dengan Android Jetpack dan library Android lainnya. Ekstensi KTX menyediakan Kotlin yang ringkas dan idiomatis untuk Jetpack, platform Android, serta API lainnya. Untuk melakukannya, ekstensi ini memanfaatkan beberapa fitur bahasa Kotlin, termasuk yang berikut:

  • Fungsi ekstensi
  • Properti ekstensi
  • Lambda
  • Parameter bernama
  • Nilai default parameter
  • Coroutine

Sebagai contoh, saat menangani SharedPreferences, Anda harus membuat editor sebelum Anda dapat memodifikasi data preferensi. Anda juga harus menerapkan atau melakukan perubahan tersebut setelah selesai mengedit, seperti yang ditunjukkan pada contoh berikut:

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

Lambda Kotlin sangat cocok untuk kasus penggunaan ini. Hal ini memungkinkan Anda melakukan pendekatan lebih singkat dengan meneruskan blok kode untuk dijalankan setelah editor dibuat, memungkinkan kode dieksekusi, dan memungkinkan SharedPreferences API menerapkan perubahan secara atomic.

Berikut adalah contoh salah satu fungsi Inti Android KTX, SharedPreferences.edit, yang menambahkan fungsi edit ke SharedPreferences. Fungsi ini menggunakan flag boolean opsional sebagai argumen pertamanya yang menunjukkan apakah akan melakukan atau menerapkan perubahan. Fungsi tersebut juga menerima tindakan untuk dilakukan pada editor SharedPreferences dalam bentuk lambda.

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

Pemanggil dapat memilih apakah akan melakukan atau menerapkan perubahan. Lambda action sendiri merupakan fungsi ekstensi anonim pada SharedPreferences.Editor yang menampilkan Unit, seperti yang ditunjukkan oleh tanda tangannya. Inilah sebabnya mengapa di dalam blok Anda bisa melakukan pekerjaan langsung di SharedPreferences.Editor.

Terakhir, tanda tangan SharedPreferences.edit() berisi kata kunci inline. Kata kunci ini memberi tahu compiler Kotlin agar menyalin dan menempelkan (atau inline) bytecode yang dikompilasi untuk fungsi setiap kali fungsi tersebut digunakan. Hal ini demi menghindari overhead membuat instance class baru untuk masing-masing action setiap kali fungsi ini dipanggil.

Pola kode penerusan ini menggunakan lambda, menerapkan default logis yang dapat diganti, dan menambahkan perilaku ini ke API yang ada menggunakan fungsi ekstensi inline adalah tipikal penyempurnaan yang disediakan oleh library Android KTX.

Menggunakan Android KTX di project Anda

Untuk mulai menggunakan Android KTX, tambahkan dependensi berikut ke file build.gradle project Anda:

repositories {
        google()
    }
    

Android KTX diatur ke dalam modul, di mana setiap modul berisi satu atau beberapa paket.

Anda harus menyertakan dependensi untuk setiap artefak modul pada file build.gradle aplikasi Anda. Ingatlah untuk menambahkan nomor versi ke artefak. Misalnya, jika Anda menggunakan modul core-ktx, dependensi yang terbentuk sepenuhnya akan terlihat mirip dengan berikut ini:

dependencies {
        implementation 'androidx.core:core-ktx:1.0.1'
    }
    

Modul

Android KTX berisi satu modul inti yang menyediakan ekstensi Kotlin untuk API framework umum dan beberapa ekstensi khusus domain.

Dengan pengecualian modul inti, semua artefak modul KTX menggantikan dependensi Java yang mendasarinya pada file build.gradle. Misalnya, Anda dapat mengganti dependensi androidx.fragment:fragment dengan androidx.fragment:fragment-ktx. Sintaks ini membantu mengelola pembuatan versi yang lebih optimal dan tidak menambahkan persyaratan deklarasi dependensi tambahan.

KTX Inti

Modul KTX Inti menyediakan ekstensi untuk library umum yang merupakan bagian dari framework Android. Library ini tidak memiliki dependensi berbasis Java yang perlu Anda tambahkan ke build.gradle.

Berikut daftar paket yang terdapat dalam modul KTX Inti:

KTX Fragmen

Dependensi: androidx.fragment:fragment-ktx:$version. Pastikan Anda menentukan $version atau menggantinya dengan nilai literal.

Modul KTX Fragmen menyediakan sejumlah ekstensi untuk menyederhanakan API fragmen. Misalnya, Anda dapat menyederhanakan transaksi fragmen dengan lambda:

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

Anda juga dapat mengikat ke ViewModel dalam satu baris dengan menggunakan delegasi properti viewModels dan activityViewModels:

// 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>()
    

KTX Palet

Dependensi: androidx.palette:palette-ktx:$version. Pastikan Anda menentukan $version atau menggantinya dengan nilai literal.

Modul KTX Palet menawarkan dukungan Kotlin idiomatis untuk menangani palet warna.

Misalnya, saat menangani instance Palette, Anda bisa mengambil swatch selected untuk target tertentu menggunakan operator get ([ ]):

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

KTX SQLite

Dependensi: androidx.sqlite:sqlite-ktx:$version. Pastikan Anda menentukan $version atau menggantinya dengan nilai literal.

Ekstensi SQLite menggabungkan kode terkait SQL dalam transaksi, yang menghilangkan banyak kode boilerplate, seperti yang ditunjukkan pada contoh berikut:

db.transaction {
        // insert data
    }
    

KTX Koleksi

Dependensi: androidx.collection:collection-ktx:$version. Pastikan Anda menentukan $version atau menggantinya dengan nilai literal.

Ekstensi Koleksi berisi fungsi utilitas untuk bekerja dengan library koleksi Android yang hemat memori, termasuk ArrayMap, LongParseArray, LruCache, dan lainnya.

Ekstensi koleksi memanfaatkan overload operator Kotlin untuk menyederhanakan banyak hal seperti penggabungan koleksi, seperti yang ditunjukkan pada contoh berikut:

// 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
    

KTX ViewModel

Dependensi: androidx.lifecycle:lifecycle-viewmodel-ktx:$version. Tentukan atau ganti $version untuk merefleksikan versi modul terbaru.

Library KTX ViewModel menyediakan fungsi viewModelScope() yang menjadikannya mudah untuk meluncurkan coroutine dari ViewModel Anda. CoroutineScope diikat ke Dispatchers.Main dan otomatis dibatalkan jika ViewModel dihapus. Anda dapat menggunakan viewModelScope() daripada membuat cakupan baru untuk setiap ViewModel.

Sebagai contoh, fungsi viewModelScope() berikut meluncurkan coroutine yang membuat permintaan jaringan di thread latar belakang. Library menangani semua penyiapan dan pembersihan cakupan yang sesuai:

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

KTX Aliran Reaktif

Dependensi: androidx.lifecycle:lifecycle-reactivestreams-ktx:$version. Pastikan Anda menentukan $version atau menggantinya dengan nilai literal.

Modul KTX Aliran Reaktif memungkinkan Anda membuat aliran LiveData yang dapat diamati dari penerbit ReactiveStreams.

Sebagai contoh, asumsikan database dengan daftar pengguna yang kecil. Di aplikasi, Anda memuat database ke dalam memori lalu menampilkan data pengguna di UI Anda. Untuk mencapainya, Anda dapat menggunakan RxJava. Komponen Jetpack Room dapat mengambil daftar pengguna sebagai Flowable. Dalam skenario ini, Anda juga harus mengelola langganan penerbit Rx sepanjang umur fragmen atau aktivitas Anda.

Namun, dengan LiveDataReactiveStreams, Anda bisa mendapat manfaat dari RxJava dan kumpulan operator yang beragam serta kemampuan penjadwalan kerjanya sekaligus menangani kemudahan LiveData. Sebagai contoh, cuplikan berikut membuat aliran yang dapat diamati dari penerbit Flowable RxJava:

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

Dependensi:

  • androidx.navigation:navigation-runtime-ktx:$version
  • androidx.navigation:navigation-fragment-ktx:$version
  • androidx.navigation:navigation-ui-ktx:$version

Pastikan Anda menentukan $version atau menggantinya dengan nilai literal.

Setiap komponen library Navigasi memiliki versi KTX-nya sendiri yang menyesuaikan API agar Kotlin lebih ringkas dan idiomatis.

Gunakan fungsi ekstensi dan delegasi properti untuk mengakses argumen tujuan dan bernavigasi ke tujuan, seperti yang ditunjukkan pada contoh berikut:

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

    }
    

KTX WorkManager

Dependensi: androidx.work:work-runtime-ktx:$version. Pastikan Anda menentukan $version atau menggantinya dengan nilai literal.

KTX WorkManager menambahkan dukungan untuk coroutine Kotlin dengan menambahkan fungsi ekstensi ke Operations dan ListenableFutures guna menangguhkan coroutine saat ini, seperti yang ditunjukkan pada contoh berikut:

// Inside of a coroutine...

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

    // Resume after work completes...
    

KTX Play Core

Dependensi: com.google.android.play:core-ktx:$version. Pastikan Anda menentukan $version atau menggantinya dengan nilai literal.

KTX Play Core menambahkan dukungan pada coroutine Kotlin untuk permintaan one-shot dan Alur untuk memantau pembaruan status dengan menambahkan fungsi ekstensi ke SplitInstallManager dan AppUpdateManager di library Play Core.

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

Informasi selengkapnya

Untuk mempelajari lebih lanjut tentang Android KTX, lihat video DevBytes.

Untuk melaporkan masalah atau menyarankan fitur, gunakan Pelacak masalah Android KTX.