Android Dagger Hilt Kullanımı

Selamlar,

Dagger 2, android platformunda Dependency Injection için kullanılır. Android’de çeşitli di (dependency injection) kütüphaneleri var fakat en popüleri ve Google’ın desteklediği Dagger’dır.

Bugün Dagger’ın yeni bir versiyonu olan Hilt’i inceleyip projemize entegre edeceğiz.

Adım 1: Projeye Ekleme

App build.gradle dosyamızın dependencies içerisine

def daggerHilt = "2.28.3-alpha"
implementation "com.google.dagger:hilt-android:$daggerHilt"
kapt "com.google.dagger:hilt-android-compiler:$daggerHilt"

en üstte bulunan apply pluginlerin olduğu yere

apply plugin: 'dagger.hilt.android.plugin'

ekliyoruz. Buraya son olarak

Android {
  kotlinOptions {
    jvmTarget = '1.8'
 }
}

ekliyoruz.

Project build.gradle dosyamızı açıp

buildscript {   
   repositories {     // other repositories...     
      mavenCentral()   
}   
  dependencies {     // other plugins...     
    classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28.3-alpha'   
  }
}

ekliyoruz.

Adım 2: Application Class

Projemizi yeni başlattıysak eğer herhangi bir Application class eklenmemiş olabilir. Bu durumda kendimiz eklememiz gerekiyor.

@HiltAndroidApp
class MyApplication: Application() {

    override fun onCreate() {
        super.onCreate()
    }
}

Dagger kullanmasak bile normalde yukarıdaki gibi Application class oluşturabiliyorduk. Buradaki tek fark class adının hemen üzerinde bulunan @HiltAndroidApp attonaion’ı. Bunu eklediğimizde Dagger, bu class’ın Application class olduğunu biliyor ve build time’da generate ediyor.

AndroidManifest.xml dosyamıza <application> tagı içerisine

android:name=".application.MyApplication"

eklemeyi unutmuyoruz. Şimdi projemizi Rebuild ederek hata var mı yok mu diye kontrol ediyoruz ve eğer hata yok ise Adım 3’ten devam ediyoruz.

Adım 3: Module Oluşturma

Proje ağacımızda “di” adında yeni bir Package oluşturalım. İçerisine AppModule adında bir object ekleyelim.

Burası bizim injection yapmak istediğimiz metodları içeriyor olacak. Ben örnek olarak Room database metodu oluşturacağım ve onu başka yerlere nasıl inject edeceğimizi göstereceğim.

Örnek olarak aşağıdaki kodu inceleyelim

@Module
@InstallIn(ApplicationComponent::class)
object AppModule {

    @Singleton
    @Provides
    fun provideRunningDatabase(
        @ApplicationContext appContext: Context
    ) = Room.databaseBuilder(
        appContext,
        RunningDatabase::class.java,
        Constants.RUNNING_DATABASE_NAME,
    ).build()

    @Singleton
    @Provides
    fun provideRunDao(db: RunningDatabase) = db.getRunDao() 
}

AppModule object’imizin bir Module olduğunu Dagger’a söylememiz gerekli. Bunun için @Module attonation’ı kullanıyoruz.

Hemen altında yere alan @InstallIn‘e ise Hilt’in bizim için hazırladığı componentlerden birini ekliyoruz. Ben burada ApplicationComponenti ekledim.

Buraya;

  • ActivityComponent
  • FragmentComponent
  • ServiceComponent

de eklenebilir. Daha fazla detay için

https://dagger.dev/hilt/components

provideRunningDatabase metodumuzun herhangi bir yerde inject edilebilmesi için @Provides attonation’ı eklememiz gerekli. Eğer tek bir instance oluşturmak istiyorsak bir de @Singleton ekliyoruz.

Room gibi context isteyen classlar için parametre olarak @ApplicationContext ekleyerek Room’a ihtiyaç duyduğu context’i verebiliyoruz.

provideRunDao metodu ile Room database için hazırlamış olduğumuz Dao’yu inject edebiliriz.

Artık örnek bir inject edilebilir method oluşturduk. Artık bunu kullanabilir.

Adım 4: Inject

3. adımda oluşturduğumuz metodu MainActivity içerisine inject edip kullanalım.

Aslında 2 tip inject yöntemi vardır. Bunlar

  • Class içerisinde @Inject
  • Class Constractor’da @Inject

4.1. Class içerisinde Inject

Bunun için MainActivity class’ında @Inject attonation’unu kullanabiliriz.

@AndroidEntryPoint
class MainActivity: AppCompatActivity() {

   @Inject
   lateinit var runDao: RunDao

}

runDao değişkeni, bize istediğimiz database tablosunu getirebilecektir.

4.2. Constractor içinde Inject

Herhangi bir class’ın constractor’ına provide ettiğimiz metodları ekleyebiliriz. Bu durumda class oluştuğunda bizim @Provide attonation’ı verdiğimiz her metod bizim için kullanılabilir haldedir.

@AndroidEntryPoint
class HomeFragment @Inject constructor(
    private val userRepository: userRepository
) : BaseFragment() {
}

Artık hazır.

MainActivity üzerindeki @AndroidEnrtyPoint attonation’ununu eklemeyi unutmayın.

Herhangi bir sorunuz olursa yorumlara yazabilirsiniz.


Kaynaklar:

  • dagger.dev
  • developer.android.com

Bir cevap yazın

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