Kotlin Extensions (Uzantılar)

By | 10 Nisan 2022

Selam arkadaşlar, bu dersimizde geliştirme aşamasında işlerimizi kolaylaştıran extension’ın ne olduğu ve çokça kullanılan bazı extensions’lara değiniyor olacağız.

Kotlin Extensions Nedir?

Extensions, herhangi bir sınıftan miras almadan bir sınıfı yeni işlemlerle genişletme durumudur.

Konuyu örnek bir senaryo üzerinden giderek anlamaya çalışalım. Örneğin kullanıcının veri girdiği bir ekranımız olsun ve gerekli alanlar doldurulmadığı sürece işlemi yapacak olan butonun tıklanma özelliği aktif olmamalı. Mantık çerçevesinde düşündüğümüzde bu gibi kontrollere farklı ekranlarda da ihtiyacımız olacak. O halde bunun için bir extensions yazabiliriz 🙂

Extensions Nasıl Yazılır?

Extensions yazarken gruplandırmalar önemlidir. Her şey kendi ilgili alanında yer almalıdır. Üstte buton ile ilgili bir senaryomuz vardı. O halde ButtonExtension diye bir dosya açıp Buton ile ilgili uzantılarımızı oraya yazabiliriz.

Aşağıda 2 tane örneğimiz mevcut.

fun Button.activate() {
    this.isEnabled = true
    this.alpha = 1F
}

fun Button.deactivate() {
    this.isEnabled = false
    this.alpha = 0.6F
}

Button.functionName şeklinde uzantı yazdık. EditText ile ilgili olsaydı eğer onunla ilgili bir dosya açıp orada da EditText uzantılarını yazıyor olacaktık. Üstte butonların tıklanabilir durumlarını ayarlayabileceğimiz 2 güzel uzantımız var. Peki bunları nasıl kullanabiliriz onu da görelim.

binding.btnSaveMe.deactive()
ya da
binding.btnLogin.active()

Sıkça kullanılan başka uzantılardan da bahsedeyim hemen. Ekranlarda duruma göre bazı view’ları gizleyip gösteririz. Bunun için ViewExtensions isminde bir dosya açıp içine de aşağıdaki ekleyelim.

fun View.visible() {
    visibility = View.VISIBLE
}

fun View.gone() {
    visibility = View.GONE
}

fun View.invisible() {
    visibility = View.INVISIBLE
}

Nasıl kullanabileceğinizi tahmin ediyorsunuzdur ama yine de tekrar olsun 🙂

binding.viewIdName.gone()
binding.edtPhoneNumber.visible()

Bunların dışında sıkça kullanılan Toast ve Snackbar için de extensions yazabiliriz. Geliştirme esnasında sıkça kullandığımız bu yapıları tekrar ve tekrar yazmak zahmetli olacaktır. O halde onların da uzantılarını yazalım.

fun Context.showSmallLengthToast(text: String) {
    Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
}

fun Context.showLongLengthToast(text: String) {
    Toast.makeText(this, text, Toast.LENGTH_LONG).show()
}
fun View.showSmallSnackbar(text: String) {
    Snackbar.make(this, text, Snackbar.LENGTH_SHORT).show()
}

fun View.showLongSnackbar(text: String) {
    Snackbar.make(this, text, Snackbar.LENGTH_LONG).show()
}

Aşağıdaki gibi de kısa bir şekilde her yerde kullanabiliriz.

showSmallLengthToast("Mesajımız")
showSmallLengthSnackbar("Mesajımız")

Extensions’larımızda görüldüğü gibi ihtiyaç doğrultsunda istediğimiz parametreleri de göndererek işleme tabi tutabiliriz.

Şu ana kadarki örneklerimiz çok sıradan( küçümsemiyorum yanlış anlaşılmasın 🙂 ) ve View ağırlıklı uzantılardı. Şimdi daha farklı ihtiyaçlar doğrultusunda neler yazılabilir onlardan da birkaç örnek görelim.

Uygulama içinde izin alma işlemlerini birçoğumuz yapmışızdır. if kontrolü içerisinde belirttiğimiz iznin verilip verilmediğini birçok izin işlemi için aynı şeyleri yapıyoruz. Bunu bir kereliğine yazıp istediğimiz izni parametre olarak göndererek birçok uzun adımdan kurtulmuş oluruz.

fun Activity.hasPermission(permission: String): Boolean {
    return ActivityCompat.checkSelfPermission(
        this,
        permission
    ) == PackageManager.PERMISSION_GRANTED
}

Birçok projede Glide kütüphanesi için de uzantı yazıldığını görebilirsiniz.

fun ImageView.loadImagesWithGlideExt(url: String) {
    Glide.with(this)
        .load(url)
        .centerCrop()
        .error(R.drawable.ic_broken_image)
        .diskCacheStrategy(DiskCacheStrategy.ALL)
        .placeholder(R.drawable.movie_loading_animation)
        .into(this)
}

Bunun gibi daha birçok extensions bulabilir veya kendi ihtiyaçlarınız için yenilerini yazabilirsiniz. Fikir vermek amacıyla böyle örnekleri görmek güzel olacaktır. İyi günler diliyorum 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir