Dagger 2 : Memahami Field Injection
Materi yang saya bawa kali ini adalah materi lanjutan dari beberapa tulisan saya mengenai Dagger
- Dagger 2 : Memahami Component & Constructor Injection
- Dagger 2 : Memahami Module & Provides
- Dagger 2 : Memahami Module & Binds
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
- Kita harus create / membuat MonsterComponent dulu
- 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
- 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
- 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