Library Dagger 2 - Provides dan Module Menggunakan Kotlin


Assalamu'alaikum Warahmatullahi Wabarakatuh.

Library Dagger 2 pastinya sudah tidak asing lagi di telinga kalian, karena kepopulerannya di kalangan programmer, pada materi-materi sebelumnya kita telah membahas mengenai penggunaan dasar dari Dagger 2, yaitu penggunaan @Inject dan @Component, ada bebapa komponent inti lagi dari library tesebut, seperti yang akan saya bahas pada postingan ini, yaitu @Provides dan @Module.


Pada pembahasan kali ini kita akan belajar cara menggunakan anotasi @Provides dan @Module pada Dagger 2, fungsi dari kedua anotasi tersebut digunakan untuk menendakan class yang akan dijadikan module dan sebagai penyedia dependency yang akan digunakan pada class yang dituju.

Materi yang harus kalian pelajari sebelumnya:

Untuk lebih detailnya, mari kita lanjutkan project yang pernah kita kerjakan pada tutorial sebelumnya, jadi saya harap kalian telah mengikuti materi yang sudah saya barikan tersebut, jika belum silakan kunjungi tautan yang telah saya berikan sebelumnya.

Menerapkan Module dan Provides pada Project

1) Buka class Senjata yang sudah kalian buat pada tutorial sebelumnya. Kodenya kurang lebih seperti berikut ini.
class Senjata (val namaPedang: String, 
               val namaTombak: String) {
    
    fun tombak(): String {
        return namaTombak
    }

    fun pedang(): String {
        return namaPedang
    }
}
Pada class tersebut terdapat parameter dengan 2 data String, artinya class tersebut memerlukan 2 data String dan wajib memiliki nilai, lalu bagaimana cara untuk menambahkan nilai pada kedua parameter tersebut.

Dengan menggunakan Dagger 2, kita tidak perlu meng-inisialisasikan parameter tersebut saat membuat instance didalam MainActivity. contohnya seperti ini.
val senjata = Senjata("Pedang Larva", "Pedang Halilintar")
Kalo cuma di MainActivity saja tidak jadi masalah, iya kan?, tapi bagaimana jika ada class lain juga yang ingin mengakses class Senjata, pastinya kita juga perlu membuat instance dari class tersebut satu-per-satu kan, kalo gitu bakalan ribet nantinya.

Dengan menggunakan Dagger 2 dan sihir ajaibnya, yaitu @Provides dan @Module, kita dapat menginisialisasi class tersebut dan Constructor beserta Parameternya didalam class Module.

2) Buat class baru, bernama "BattleModule", class ini digunakan sebagai class module kita dan sebagai penyedia dependency, untuk contoh kodenya kurang lebih seperti berikut ini,
import dagger.Module
import dagger.Provides

@Module
class BattleModule {

    //Menyediakan Dependenci yang akan digunakan dengan Parameter didalam Class Senjata
    @Provides
    fun setSenjata(): Senjata {
        return Senjata("Pedang Larva", "Tombak Halilintar")
    }
}
Didalam class tersebut terdapat sebuah method bernama setSenjata() yang ditandai dengan anotasi Provides, method ini digunakan sebagai penyedia dependenci yang akan digunakan, method tersebut akan mengembalikan nilai berupa Objek dari Class Senjata beserta parameternya, Jadi kita cukup inisialisasikan data didalam parameter tersebut pada class ini saja.

Jadi kita tidak perlu membuat Instance beserta Parameternya di class lain. Perlu kalian ketahui, untuk penamaan methodnya bisa dengan nama apa saja, terserah. Pasti kalian berfikir bahwa method tersebut akan kita panggil pada class yang membutuhkan, sebenarnya tidak, ajaibnya method tersebut tidak harus kita panggil di class lain, kita cukup membuatnya didalam class Module.

3) Buka kembali class interface BattleComponent, disini kita akan menambahkan class BattleModule pada class Component tersebut.
import dagger.Component

@Component(modules = [BattleModule::class])
interface BattleComponent {
    fun inject(context: MainActivity)
}
Pada anotasi Component kita menambahkan Class BattleModule, karena interface tersebut berperan untuk menghubungkan atau menjembatani antara Module dengan data yang di Inject, seperti biasa didalam interface tersebut terdapat method untuk menentukan class mana yang akan menerima Inject.

4) Pada class DarkKnight dan LightKnight, kita cukup menambahkan Parameter pada classnya dan membuat variable dari Class Senjata, seperti ini.

DarkKnight
import javax.inject.Inject

class DarkKnight @Inject constructor (val senjata: Senjata) {

    fun setEquip(): String {
        return "Kolempok DarkKnight Bertempur Menggunakan " + senjata.tombak()
    }
}
LightKnight
import javax.inject.Inject

class LightKnight @Inject constructor (val senjata: Senjata) {

    fun setEquip(): String {
        return "Kolempok LightKnight Bertempur Menggunakan " + senjata.pedang()
    }
}
Setelah itu jangan lupa untuk Rebuild project tersebut.

5) Buka class MainActivity kalian, untuk source codenya tidak jauh berbeda, seperti berikut ini.
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

import javax.inject.Inject

class MainActivity : AppCompatActivity() {

    //Deklarasi Variable dengan menggunakan Anotasi Inject
    @Inject
    lateinit var darkKnight: DarkKnight
    @Inject
    lateinit var lightKnight: LightKnight

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //Mendapatkan Konteks dari class yang bersangkutan
        DaggerBattleComponent.create().inject(this)

        //Menambahkan listener pada Button
        click_me.setOnClickListener {
            //Menampilkan Data pada TextView yang diambil dari Fungsi setEquip dari kedua Class tersebut
            val getReport = lightKnight.setEquip() + " dan " + darkKnight.setEquip()
            report.text = getReport
        }
    }
}
Terakhir, jalankan project tersebut.

Demo:


Pada tutorial berikutnya kita akan belajar cara menggunakan fungsi Qualifier pada Dagger 2 dengan menggunakan bahasa pemrograman kotlin, sekian tutorial dari saya, semoga bermanfaat, jika ada pertanyaan, silakan isi kolom komentar dibawah ini.

Wassalamu'alaikum Warahmatullahi Wabarakatuh.

Disqus Comments