Dagger 2 : Memahami Field Injection

Ian Christian Adolfian Damping
3 min readApr 7, 2021
Dagger in the field by wish

Materi yang saya bawa kali ini adalah materi lanjutan dari beberapa tulisan saya mengenai Dagger

Permasalahan

Pada materi sebelumnya kita tau pentingnya menerapkan konsep DI dan bagaimana menerapkannya menggunakan Dagger Constructor Injection.

Tapi sekarang bagaimana kita menerapkan konsep tersebut pada Activity / Fragment ?
Bagi temen-temen yang belum tau beberapa class tertentu dari Framework Android seperti Activity / Fragment di instantiated oleh system, sehingga kita tidak bisa menerapkan Constructor Injection pada class-class tersebut.

Field Injection to The Rescue

Okay sebelum masuk ke materi Dagger bagi temen-temen yang belum tau apa itu field bisa liat contoh ini yaa

class Book {

//this called Fields / Attributes / Member Variables
var title: String = ""
var author: String = ""
var numberOfPages = 0
}

Nah untuk materi Dagger nya pun tidak banyak, kita hanya perlu merubah pada Component & cara menggunakannya

Component

Pada materi sebelumnya kita menggunakan Component sebagai tempat penyedia data dalam contoh ini MyMonster class

@Component(modules = [AttributeModule::class, MyMonsterModule::class])
interface MonsterComponent {

fun getMyMonster(): MyMonster
}

Sekarang kita rubah menjadi sebuah fungsi / function yang menerima sebuah Activity / Fragment class sebagai tujuan nya, agar Dagger tau dimana sebuah MyMonster Object akan di berikan

@Component(modules = [AttributeModule::class, MyMonsterModule::class])
interface MonsterComponent {

fun inject(activity:MainActivity)

}

Ohiya penggunaan Component ini tidak terbatas hanya untuk satu Activity class saja ya, kita bisa menambahkan fungsi / function lain untuk melakukan injeksi dibanyak Activity class lainnya

Penggunaan

Nah karena Component berubah maka cara menggunakannya pun berubah, Mari kita lihat contoh sebelumnya saya buat menjadi 2 bagian penting ya

  1. Kita harus create / membuat MonsterComponent dulu
  2. Kemudian kita menggunakan Component tersebut untuk mendapatkan data MyMonster
class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding

private lateinit var myMonster: MyMonster


override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

(1) val component: MonsterComponent = DaggerMonsterComponent.create()
(2) myMonster = component.getMyMonster()
binding.tvDragon.text = myMonster.summonMyMonster()


}
}

Pada contoh penggunaan yang baru juga akan saya breakdown menjadi 2 bagian juga ya

  1. pada field yang ingin kita injeksi dalam contoh ini adalah myMonster kita menggunakan anotasi Inject. Jangan di private ya fieldnya karena Dagger tidak support injeksi pada field yang access modifiernya private
  2. kita tidak perlu create / membuat MonsterComponent, kita hanya perlu menggunakannya untuk memberitahukan dimana Dagger akan memberikan injeksi
class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding

@Inject
(1) lateinit var myMonster: MyMonster


override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
(2) DaggerMonsterComponent.create().inject(this)

binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

binding.tvDragon.text = myMonster.summonMyMonster()


}
}

Nah sekarang field injection sudah selesai kita lakukan yeaay !

Kalau kita lihat generated codenya Dagger akan melakukan field injection pada MainActivity melalui MainActivity_MembersInjector class

public final class DaggerMonsterComponent implements MonsterComponent {
... another generated code ...

@Override
public void inject(MainActivity activity) {
injectMainActivity(activity);
}

private MainActivity injectMainActivity(MainActivity instance) {
MainActivity_MembersInjector.injectMyMonster(instance, myMonster());
return instance;
}
... another generated code ...
}

Okay itu saja materi yang bisa saya sampaikan memang mungkin sedikit membingungkan & cara mengatasinya adalah langsung Praktek ! Materi kali ini pun saya sadari hanya sebagian kecil saja dari Dagger karena masih banyak sekali yang perlu kita pelajari.

untuk bisa memahami materi ini bisa lihat di repo saya ya

Yang penting jangan malas belajar yaaa !

Terimakasih !
Sampai jumpa lagi

--

--

Ian Christian Adolfian Damping

Always curious and always want to continue learning in many ways