Hilt, Android'e yönelik bir bağımlılık ekleme kitaplığıdır. Bu kitaplık, projenizde manuel bağımlılık eklemeyle ilgili ortak çalışmaları azaltır. Manuel bağımlılık yerleştirme işlemi yapmak için her sınıfı ve bağımlılıklarını el ile oluşturmanız ve bağımlılıkları yeniden kullanmak ve yönetmek için container'ları kullanmanız gerekir.
Hilt, projenizdeki her Android sınıfı için container'lar sağlayarak ve bunların yaşam döngülerini otomatik olarak yöneterek uygulamanızda DI kullanımının standart bir yolunu sunar. Hilt, Dagger'ın sağladığı derleme zamanı doğruluğu, çalışma zamanı performansı, ölçeklenebilirlik ve Android Studio desteğinden yararlanmak için popüler Dagger DI kitaplığının üzerine geliştirilmiştir. Daha fazla bilgi için Hilt andDagger bölümünü inceleyin.
Bu kılavuzda, Hilt ile ilgili temel kavramlar ve Hilt tarafından oluşturulan kapsayıcılar açıklanmaktadır. Ayrıca, Hilt'i kullanmak için mevcut bir uygulamanın nasıl önyükleneceğine dair bir gösterim de içerir.
Bağımlılık ekleme
İlk olarak hilt-android-gradle-plugin
eklentisini projenizin kök build.gradle
dosyasına ekleyin:
Modern
plugins { ... id 'com.google.dagger.hilt.android' version '2.44' apply false }
Kotlin
plugins { ... id("com.google.dagger.hilt.android") version "2.44" apply false }
Ardından Gradle eklentisini uygulayın ve şu bağımlılıkları app/build.gradle
dosyanıza ekleyin:
Modern
... plugins { id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } android { ... } dependencies { implementation "com.google.dagger:hilt-android:2.44" kapt "com.google.dagger:hilt-compiler:2.44" } // Allow references to generated code kapt { correctErrorTypes true }
Kotlin
plugins { kotlin("kapt") id("com.google.dagger.hilt.android") } android { ... } dependencies { implementation("com.google.dagger:hilt-android:2.44") kapt("com.google.dagger:hilt-android-compiler:2.44") } // Allow references to generated code kapt { correctErrorTypes = true }
Hilt, Java 8 özelliklerini kullanır. Projenizde Java 8'i etkinleştirmek için app/build.gradle
dosyasına aşağıdaki kodu ekleyin:
Modern
android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
Kotlin
android { ... compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } }
Hilt uygulama sınıfı
Hilt'i kullanan tüm uygulamalar, @HiltAndroidApp
ek açıklamasına sahip bir Application
sınıfı içermelidir.
@HiltAndroidApp
, uygulama düzeyinde bağımlılık kapsayıcısı olarak hizmet veren uygulamanız için bir temel sınıf da dahil olmak üzere Hilt'in kod oluşturma işlemini tetikler.
Kotlin
@HiltAndroidApp class ExampleApplication : Application() { ... }
Java
@HiltAndroidApp public class ExampleApplication extends Application { ... }
Oluşturulan bu Hilt bileşeni, Application
nesnesinin yaşam döngüsüne eklenir ve buna bağımlılıklar sağlar. Ayrıca, uygulamanın üst bileşenidir. Yani diğer bileşenler, sağladığı bağımlılıklara erişebilir.
Android sınıflarına bağımlılık ekleme
Application
sınıfınızda Hilt ayarlandıktan ve uygulama düzeyinde bir bileşen kullanılabilir hale geldikten sonra, Hilt, @AndroidEntryPoint
ek açıklamasına sahip diğer Android sınıflarına bağımlılıklar sağlayabilir:
Kotlin
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { ... }
Java
@AndroidEntryPoint public class ExampleActivity extends AppCompatActivity { ... }
Hilt şu anda aşağıdaki Android sınıflarını desteklemektedir:
Application
(@HiltAndroidApp
kullanarak)ViewModel
(@HiltViewModel
kullanarak)Activity
Fragment
View
Service
BroadcastReceiver
Bir Android sınıfına @AndroidEntryPoint
ile ek açıklama eklerseniz bu sınıfı kullanan Android sınıflarına da ek açıklama eklemeniz gerekir. Örneğin, bir parçaya ek açıklama eklerseniz bu parçayı kullandığınız tüm etkinliklere de ek açıklama eklemeniz gerekir.
@AndroidEntryPoint
, projenizdeki her Android sınıfı için ayrı bir Hilt bileşeni oluşturur. Bu bileşenler, Bileşen hiyerarşisi bölümünde açıklandığı gibi ilgili üst sınıflarından bağımlılıklar alabilir.
Bir bileşenden bağımlılık elde etmek için @Inject
ek açıklamasını kullanarak alan yerleştirme işlemi gerçekleştirin:
Kotlin
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { @Inject lateinit var analytics: AnalyticsAdapter ... }
Java
@AndroidEntryPoint public class ExampleActivity extends AppCompatActivity { @Inject AnalyticsAdapter analytics; ... }
Hilt'in eklediği sınıflar, yerleştirmeyi kullanan başka temel sınıflara da sahip olabilir.
Bu sınıflar soyut olmaları halinde @AndroidEntryPoint
ek açıklamasına ihtiyaç duymaz.
Bir Android sınıfının hangi yaşam döngüsü geri çağırmaya eklendiği hakkında daha fazla bilgi edinmek için Bileşen ömürleri bölümüne bakın.
Hilt bağlamalarını tanımlama
Alan yerleştirme işlemini gerçekleştirmek için Hilt'in ilgili bileşenden gerekli bağımlılıkların örneklerini nasıl sağlayacağını bilmesi gerekir. Bağlama, bir türün örneklerini bağımlılık olarak sağlamak için gerekli olan bilgileri içerir.
Hilt'e bağlama bilgileri sağlamanın bir yolu oluşturucu yerleştirme yöntemidir. Hilt'e söz konusu sınıfın örneklerini nasıl sağlayacağını bildirmek için bir sınıfın kurucusundaki @Inject
ek açıklamasını kullanın:
Kotlin
class AnalyticsAdapter @Inject constructor( private val service: AnalyticsService ) { ... }
Java
public class AnalyticsAdapter { private final AnalyticsService service; @Inject AnalyticsAdapter(AnalyticsService service) { this.service = service; } ... }
Bir sınıfın ek açıklamalı oluşturucunun parametreleri, ilgili sınıfın bağımlılıklarıdır. Örnekte, AnalyticsAdapter
bağımlılığı AnalyticsService
parametresine sahiptir. Bu nedenle, Hilt'in AnalyticsService
örneklerinin nasıl sağlanacağını da bilmesi gerekir.
Hilt modülleri
Bazen türlere oluşturucu enjekte edilemez. Bunun birden çok nedeni olabilir. Örneğin, bir arayüzde yapıcı enjektörü yapamazsınız. Ayrıca, harici bir kitaplıktaki sınıf gibi size ait olmayan bir türü de oluşturucu ile ekleyemezsiniz. Bu durumlarda, Hilt modüllerini kullanarak Hilt'e bağlama bilgilerini sağlayabilirsiniz.
Hilt modülü, @Module
ek açıklamasına sahip bir sınıftır. Bir Dagger modülü gibi bu modül de Hilt'e belirli türlerin örneklerini nasıl sağlayacağını bildirir. Dagger modüllerinden farklı olarak, Hilt'e her bir modülün hangi Android sınıfında kullanılacağını veya hangi Android sınıfında kurulacağını bildirmek için Hilt modüllerine @InstallIn
ek açıklamaları eklemeniz gerekir.
Hilt modüllerinde sağladığınız bağımlılıklar, Hilt modülünü yüklediğiniz Android sınıfıyla ilişkili oluşturulan tüm bileşenlerde kullanılabilir.
@Binds ile arayüz örnekleri ekleme
AnalyticsService
örneğini inceleyelim. AnalyticsService
bir arayüzse bunu oluşturucu yerleştiremezsiniz. Bunun yerine, bir Hilt modülü içinde @Binds
ile açıklama eklenmiş bir soyut işlev oluşturarak Hilt'e bağlama bilgilerini sağlayın.
@Binds
ek açıklaması, Hilt'e bir arayüz örneği sağlaması gerektiğinde hangi uygulamanın kullanılacağını bildirir.
Ek açıklamalı işlev, Hilt'e aşağıdaki bilgileri sağlar:
- İşlev döndürme türü, Hilt'e işlevin hangi arayüzün örneklerini sağladığını bildirir.
- İşlev parametresi, Hilt'e hangi uygulamanın sağlanacağını bildirir.
Kotlin
interface AnalyticsService { fun analyticsMethods() } // Constructor-injected, because Hilt needs to know how to // provide instances of AnalyticsServiceImpl, too. class AnalyticsServiceImpl @Inject constructor( ... ) : AnalyticsService { ... } @Module @InstallIn(ActivityComponent::class) abstract class AnalyticsModule { @Binds abstract fun bindAnalyticsService( analyticsServiceImpl: AnalyticsServiceImpl ): AnalyticsService }
Java
public interface AnalyticsService { void analyticsMethods(); } // Constructor-injected, because Hilt needs to know how to // provide instances of AnalyticsServiceImpl, too. public class AnalyticsServiceImpl implements AnalyticsService { ... @Inject AnalyticsServiceImpl(...) { ... } } @Module @InstallIn(ActivityComponent.class) public abstract class AnalyticsModule { @Binds public abstract AnalyticsService bindAnalyticsService( AnalyticsServiceImpl analyticsServiceImpl ); }
Hilt'in bu bağımlılığı ExampleActivity
öğesine eklemesini istediğiniz için AnalyticsModule
Hilt modülünde @InstallIn(ActivityComponent.class)
ek açıklaması bulunmaktadır. Bu ek açıklama, AnalyticsModule
kapsamındaki tüm bağımlılıkların uygulamanın tüm etkinliklerinde bulunduğu anlamına gelir.
@Provides ile örnekler ekleyin
Arayüzler, bir türü yapılandırıcı enjekte edemeyeceğiniz tek durum değildir.
Sınıfın sahibi değilseniz harici bir kitaplıktan (Retrofit, OkHttpClient
veya Room veritabanları gibi sınıflar) geldiği ya da örneklerin derleyici kalıbı ile oluşturulması gerektiğinde de oluşturucu ekleme işlemi yapılamaz.
Önceki örneği inceleyin. AnalyticsService
sınıfının doğrudan sahibi değilseniz bir Hilt modülü içinde bir işlev oluşturarak ve bu işlevi @Provides
ile notlayarak Hilt'a bu tür örnekleri nasıl sağlayacağını bildirebilirsiniz.
Ek açıklamalı işlev, Hilt'e aşağıdaki bilgileri sağlar:
- İşlev döndürme türü, Hilt'e işlevin hangi türde örnekler sağladığını bildirir.
- İşlev parametreleri, Hilt'e karşılık gelen türün bağımlılıklarını bildirir.
- İşlev gövdesi, Hilt'e karşılık gelen türün bir örneğini nasıl sağlayacağını bildirir. Hilt, söz konusu türde bir örnek sağlaması gerektiğinde işlev gövdesini yürütür.
Kotlin
@Module @InstallIn(ActivityComponent::class) object AnalyticsModule { @Provides fun provideAnalyticsService( // Potential dependencies of this type ): AnalyticsService { return Retrofit.Builder() .baseUrl("https://example.com") .build() .create(AnalyticsService::class.java) } }
Java
@Module @InstallIn(ActivityComponent.class) public class AnalyticsModule { @Provides public static AnalyticsService provideAnalyticsService( // Potential dependencies of this type ) { return new Retrofit.Builder() .baseUrl("https://example.com") .build() .create(AnalyticsService.class); } }
Aynı tür için birden fazla bağlama sağlayın
Hilt'in bağımlılık olarak aynı türden farklı uygulamaları sağlamasının gerektiği durumlarda, Hilt'e birden fazla bağlama sağlamanız gerekir. Niteleyicileri kullanarak aynı tür için birden fazla bağlama tanımlayabilirsiniz.
Niteleyici, bir tür için birden fazla bağlama tanımlanmışsa o tür için belirli bir bağlamayı tanımlamak üzere kullandığınız ek açıklamadır.
Örneği ele alalım. AnalyticsService
çağrılarına müdahale etmeniz gerekiyorsa önleyici olan bir OkHttpClient
nesnesi kullanabilirsiniz. Diğer hizmetler için çağrılara farklı bir şekilde müdahale etmeniz gerekebilir. Bu durumda, Hilt'e iki farklı OkHttpClient
uygulamasını nasıl sağlayacağını bildirmeniz gerekir.
Öncelikle, @Binds
veya @Provides
yöntemlerine ek açıklama eklemek için kullanacağınız niteleyicileri tanımlayın:
Kotlin
@Qualifier @Retention(AnnotationRetention.BINARY) annotation class AuthInterceptorOkHttpClient @Qualifier @Retention(AnnotationRetention.BINARY) annotation class OtherInterceptorOkHttpClient
Java
@Qualifier @Retention(RetentionPolicy.RUNTIME) private @interface AuthInterceptorOkHttpClient {} @Qualifier @Retention(RetentionPolicy.RUNTIME) private @interface OtherInterceptorOkHttpClient {}
Ardından, Hilt'in her niteleyiciye karşılık gelen türün bir örneğini nasıl sağlayacağını bilmesi gerekir. Bu durumda, @Provides
ile bir Hilt modülü kullanabilirsiniz.
Her iki yöntem de aynı dönüş türüne sahiptir ancak niteleyiciler bunları iki farklı bağlama olarak etiketler:
Kotlin
@Module @InstallIn(SingletonComponent::class) object NetworkModule { @AuthInterceptorOkHttpClient @Provides fun provideAuthInterceptorOkHttpClient( authInterceptor: AuthInterceptor ): OkHttpClient { return OkHttpClient.Builder() .addInterceptor(authInterceptor) .build() } @OtherInterceptorOkHttpClient @Provides fun provideOtherInterceptorOkHttpClient( otherInterceptor: OtherInterceptor ): OkHttpClient { return OkHttpClient.Builder() .addInterceptor(otherInterceptor) .build() } }
Java
@Module @InstallIn(ActivityComponent.class) public class NetworkModule { @AuthInterceptorOkHttpClient @Provides public static OkHttpClient provideAuthInterceptorOkHttpClient( AuthInterceptor authInterceptor ) { return new OkHttpClient.Builder() .addInterceptor(authInterceptor) .build(); } @OtherInterceptorOkHttpClient @Provides public static OkHttpClient provideOtherInterceptorOkHttpClient( OtherInterceptor otherInterceptor ) { return new OkHttpClient.Builder() .addInterceptor(otherInterceptor) .build(); } }
Alana veya parametreye ilgili niteleyiciyle ek açıklama ekleyerek ihtiyacınız olan belirli türü ekleyebilirsiniz:
Kotlin
// As a dependency of another class. @Module @InstallIn(ActivityComponent::class) object AnalyticsModule { @Provides fun provideAnalyticsService( @AuthInterceptorOkHttpClient okHttpClient: OkHttpClient ): AnalyticsService { return Retrofit.Builder() .baseUrl("https://example.com") .client(okHttpClient) .build() .create(AnalyticsService::class.java) } } // As a dependency of a constructor-injected class. class ExampleServiceImpl @Inject constructor( @AuthInterceptorOkHttpClient private val okHttpClient: OkHttpClient ) : ... // At field injection. @AndroidEntryPoint class ExampleActivity: AppCompatActivity() { @AuthInterceptorOkHttpClient @Inject lateinit var okHttpClient: OkHttpClient }
Java
// As a dependency of another class. @Module @InstallIn(ActivityComponent.class) public class AnalyticsModule { @Provides public static AnalyticsService provideAnalyticsService( @AuthInterceptorOkHttpClient OkHttpClient okHttpClient ) { return new Retrofit.Builder() .baseUrl("https://example.com") .client(okHttpClient) .build() .create(AnalyticsService.class); } } // As a dependency of a constructor-injected class. public class ExampleServiceImpl ... { private final OkHttpClient okHttpClient; @Inject ExampleServiceImpl(@AuthInterceptorOkHttpClient OkHttpClient okHttpClient) { this.okHttpClient = okHttpClient; } } // At field injection. @AndroidEntryPoint public class ExampleActivity extends AppCompatActivity { @AuthInterceptorOkHttpClient @Inject OkHttpClient okHttpClient; ... }
En iyi uygulama olarak, bir türe niteleyici eklerseniz bu bağımlılığı sağlamak için mümkün olan tüm yollara niteleyiciler ekleyin. Temel uygulamayı veya yaygın uygulamayı niteleyici olmadan bırakmak hataya açıktır ve Hilt'in yanlış bağımlılık eklemesine yol açabilir.
Hilt'te önceden tanımlanmış niteleyiciler
Hilt, önceden tanımlanmış bazı niteleyiciler sağlar. Örneğin, uygulama veya etkinlikten Context
sınıfına ihtiyacınız olabileceği için Hilt, @ApplicationContext
ve @ActivityContext
niteleyicilerini sağlar.
Örnekteki AnalyticsAdapter
sınıfının etkinliğin bağlamına ihtiyacı olduğunu varsayalım. Aşağıdaki kod, etkinlik bağlamının AnalyticsAdapter
öğesine nasıl sağlanacağını göstermektedir:
Kotlin
class AnalyticsAdapter @Inject constructor( @ActivityContext private val context: Context, private val service: AnalyticsService ) { ... }
Java
public class AnalyticsAdapter { private final Context context; private final AnalyticsService service; @Inject AnalyticsAdapter( @ActivityContext Context context, AnalyticsService service ) { this.context = context; this.service = service; } }
Hilt'te bulunan diğer önceden tanımlanmış bağlamalar için Bileşen varsayılan bağlamaları konusuna bakın.
Android sınıfları için oluşturulan bileşenler
Alan yerleştirme işlemi gerçekleştirebileceğiniz her Android sınıfı için @InstallIn
ek açıklamasında başvuruda bulunabileceğiniz ilişkili bir Hilt bileşeni vardır.
Her Hilt bileşeni, kendi bağlamalarını karşılık gelen Android sınıfına eklemekten sorumludur.
Önceki örnekler, Hilt modüllerinde ActivityComponent
kullanımını göstermektedir.
Hilt aşağıdaki bileşenleri sağlar:
Hilt bileşeni | Şunun için enjektör: |
---|---|
SingletonComponent |
Application |
ActivityRetainedComponent |
Yok |
ViewModelComponent |
ViewModel |
ActivityComponent |
Activity |
FragmentComponent |
Fragment |
ViewComponent |
View |
ViewWithFragmentComponent |
View , @WithFragmentBindings ile ek açıklama ekledi |
ServiceComponent |
Service |
Bileşenlerin kullanım ömrü
Hilt, üretilen bileşen sınıflarının örneklerini ilgili Android sınıflarının yaşam döngüsünü izleyerek otomatik olarak oluşturur ve kaldırır.
Oluşturulan bileşen | Oluşturulma zamanı | İmha zamanı |
---|---|---|
SingletonComponent |
Application#onCreate() |
Application kaldırıldı |
ActivityRetainedComponent |
Activity#onCreate() |
Activity#onDestroy() |
ViewModelComponent |
ViewModel oluşturuldu |
ViewModel kaldırıldı |
ActivityComponent |
Activity#onCreate() |
Activity#onDestroy() |
FragmentComponent |
Fragment#onAttach() |
Fragment#onDestroy() |
ViewComponent |
View#super() |
View kaldırıldı |
ViewWithFragmentComponent |
View#super() |
View kaldırıldı |
ServiceComponent |
Service#onCreate() |
Service#onDestroy() |
Bileşen kapsamları
Varsayılan olarak, Hilt'teki tüm bağlamalar kapsam dışındadır. Bu, uygulamanız bağlama isteğinde bulunduğunda, Hilt'in gerekli türde yeni bir örnek oluşturduğu anlamına gelir.
Örnekte, Hilt'in başka bir türe bağımlılık olarak veya alan yerleştirme (ExampleActivity
'da olduğu gibi) aracılığıyla AnalyticsAdapter
sağladığı her seferde, Hilt yeni bir AnalyticsAdapter
örneği sağlar.
Ancak Hilt, bir bağlamanın belirli bir bileşene ayarlanmasına da izin verir. Hilt, bağlamanın dahil edildiği her bileşenin örneği başına yalnızca bir kez kapsamlı bağlantı oluşturur ve bu bağlamaya yönelik tüm istekler aynı örneği paylaşır.
Aşağıdaki tabloda, oluşturulan her bileşen için kapsam ek açıklamaları listelenmiştir:
Android sınıfı | Oluşturulan bileşen | Kapsam |
---|---|---|
Application |
SingletonComponent |
@Singleton |
Activity |
ActivityRetainedComponent |
@ActivityRetainedScoped |
ViewModel |
ViewModelComponent |
@ViewModelScoped |
Activity |
ActivityComponent |
@ActivityScoped |
Fragment |
FragmentComponent |
@FragmentScoped |
View |
ViewComponent |
@ViewScoped |
View , @WithFragmentBindings ile ek açıklama ekledi |
ViewWithFragmentComponent |
@ViewScoped |
Service |
ServiceComponent |
@ServiceScoped |
Örnekte, @ActivityScoped
kullanarak AnalyticsAdapter
kapsamını ActivityComponent
için ayarlarsanız Hilt, ilgili etkinliğin ömrü boyunca aynı AnalyticsAdapter
örneğini sağlar:
Kotlin
@ActivityScoped class AnalyticsAdapter @Inject constructor( private val service: AnalyticsService ) { ... }
Java
@ActivityScoped public class AnalyticsAdapter { private final AnalyticsService service; @Inject AnalyticsAdapter(AnalyticsService service) { this.service = service; } ... }
AnalyticsService
öğesinin, yalnızca ExampleActivity
içinde değil, uygulamanın herhangi bir yerinde de her seferinde aynı örneğin kullanılmasını gerektiren bir dahili durumuna sahip olduğunu varsayalım. Bu durumda, AnalyticsService
öğesinin SingletonComponent
kapsamına alınması uygun olur. Sonuç olarak, bileşenin AnalyticsService
örneği sağlaması gerektiğinde her seferinde aynı örneği sağlar.
Aşağıdaki örnekte, bir Hilt modülündeki bileşene bir bağlamanın nasıl kapsama dahil edileceği gösterilmektedir. Bir bağlamanın kapsamı, yüklendiği bileşenin kapsamıyla eşleşmelidir. Dolayısıyla bu örnekte, AnalyticsService
öğesini ActivityComponent
yerine SingletonComponent
konumuna yüklemeniz gerekir:
Kotlin
// If AnalyticsService is an interface. @Module @InstallIn(SingletonComponent::class) abstract class AnalyticsModule { @Singleton @Binds abstract fun bindAnalyticsService( analyticsServiceImpl: AnalyticsServiceImpl ): AnalyticsService } // If you don't own AnalyticsService. @Module @InstallIn(SingletonComponent::class) object AnalyticsModule { @Singleton @Provides fun provideAnalyticsService(): AnalyticsService { return Retrofit.Builder() .baseUrl("https://example.com") .build() .create(AnalyticsService::class.java) } }
Java
// If AnalyticsService is an interface. @Module @InstallIn(SingletonComponent.class) public abstract class AnalyticsModule { @Singleton @Binds public abstract AnalyticsService bindAnalyticsService( AnalyticsServiceImpl analyticsServiceImpl ); } // If you don't own AnalyticsService. @Module @InstallIn(SingletonComponent.class) public class AnalyticsModule { @Singleton @Provides public static AnalyticsService provideAnalyticsService() { return new Retrofit.Builder() .baseUrl("https://example.com") .build() .create(AnalyticsService.class); } }
Hilt bileşen kapsamları hakkında daha fazla bilgi edinmek için Android ve Hilt'te kapsam oluşturma konusuna bakın.
Bileşen hiyerarşisi
Bir modülün bir bileşene yüklenmesi, bu bileşendeki veya bileşen hiyerarşisinde onun altında bulunan herhangi bir alt bileşendeki diğer bağlamaların bağımlılığı olarak bileşendeki bağlamalara erişilmesine olanak tanır:
Bileşen varsayılan bağlamaları
Her Hilt bileşeni, Hilt'in kendi özel bağlamalarınıza bağımlılık olarak ekleyebilmesini sağlayan bir dizi varsayılan bağlama içerir. Bu bağlamaların belirli bir alt sınıfa değil, genel etkinliğe ve parça türlerine karşılık geldiğini unutmayın. Bunun nedeni, Hilt'in tüm etkinlikleri eklemek için tek bir etkinlik bileşeni tanımı kullanmasıdır. Her etkinlik bu bileşenin farklı bir örneğini içerir.
Android bileşeni | Varsayılan bağlamalar |
---|---|
SingletonComponent |
Application |
ActivityRetainedComponent |
Application |
ViewModelComponent |
SavedStateHandle |
ActivityComponent |
Application , Activity |
FragmentComponent |
Application , Activity Fragment |
ViewComponent |
Application , Activity View |
ViewWithFragmentComponent |
Application , Activity , Fragment , View |
ServiceComponent |
Application , Service |
Uygulama bağlamı bağlaması da @ApplicationContext
ile kullanılabilir.
Örneğin:
Kotlin
class AnalyticsServiceImpl @Inject constructor( @ApplicationContext context: Context ) : AnalyticsService { ... } // The Application binding is available without qualifiers. class AnalyticsServiceImpl @Inject constructor( application: Application ) : AnalyticsService { ... }
Java
public class AnalyticsServiceImpl implements AnalyticsService { private final Context context; @Inject AnalyticsAdapter(@ApplicationContext Context context) { this.context = context; } } // The Application binding is available without qualifiers. public class AnalyticsServiceImpl implements AnalyticsService { private final Application application; @Inject AnalyticsAdapter(Application application) { this.application = application; } }
Etkinlik bağlamı bağlaması, @ActivityContext
kullanılarak da kullanılabilir. Örneğin:
Kotlin
class AnalyticsAdapter @Inject constructor( @ActivityContext context: Context ) { ... } // The Activity binding is available without qualifiers. class AnalyticsAdapter @Inject constructor( activity: FragmentActivity ) { ... }
Java
public class AnalyticsAdapter { private final Context context; @Inject AnalyticsAdapter(@ActivityContext Context context) { this.context = context; } } // The Activity binding is available without qualifiers. public class AnalyticsAdapter { private final FragmentActivity activity; @Inject AnalyticsAdapter(FragmentActivity activity) { this.activity = activity; } }
Hilt tarafından desteklenmeyen sınıflara bağımlılık ekleme
Hilt, en yaygın Android sınıflarını destekler. Ancak, Hilt'in desteklemediği sınıflarda alan yerleştirme işlemi gerçekleştirmeniz gerekebilir.
Bu durumlarda, @EntryPoint
ek açıklamasını kullanarak bir giriş noktası oluşturabilirsiniz. Giriş noktası, Hilt tarafından yönetilen kod ile olmayan kod arasındaki sınırdır. Bu, kodun Hilt'in yönettiği nesnelerin grafiğine ilk girdiği noktadır. Giriş noktaları, Hilt'in bağımlılık grafiği içinde bağımlılıklar sağlamak için Hilt'in yönetmediği kodu kullanmasına imkan tanır.
Örneğin, Hilt içerik sağlayıcıları doğrudan desteklemez. Bir içerik sağlayıcının bazı bağımlılıkları almak için Hilt kullanmasını istiyorsanız istediğiniz her bağlama türü için @EntryPoint
ile not eklenmiş bir arayüz tanımlamanız ve niteleyiciler eklemeniz gerekir. Ardından, giriş noktasının yükleneceği bileşeni belirtmek için aşağıdaki gibi @InstallIn
ekleyin:
Kotlin
class ExampleContentProvider : ContentProvider() { @EntryPoint @InstallIn(SingletonComponent::class) interface ExampleContentProviderEntryPoint { fun analyticsService(): AnalyticsService } ... }
Java
public class ExampleContentProvider extends ContentProvider { @EntryPoint @InstallIn(SingletonComponent.class) interface ExampleContentProviderEntryPoint { public AnalyticsService analyticsService(); } ... }
Bir giriş noktasına erişmek için EntryPointAccessors
adresindeki uygun statik yöntemi kullanın. Parametre, bileşen örneği veya bileşen sahibi olarak görev yapan @AndroidEntryPoint
nesnesi olmalıdır. Parametre olarak ilettiğiniz bileşenin ve EntryPointAccessors
statik yönteminin @EntryPoint
arayüzündeki @InstallIn
ek açıklamasındaki Android sınıfıyla eşleştiğinden emin olun:
Kotlin
class ExampleContentProvider: ContentProvider() { ... override fun query(...): Cursor { val appContext = context?.applicationContext ?: throw IllegalStateException() val hiltEntryPoint = EntryPointAccessors.fromApplication(appContext, ExampleContentProviderEntryPoint::class.java) val analyticsService = hiltEntryPoint.analyticsService() ... } }
Java
public class ExampleContentProvider extends ContentProvider { @Override public Cursor query(...) { Context appContext = getContext().getApplicationContext(); ExampleContentProviderEntryPoint hiltEntryPoint = EntryPointAccessors.fromApplication(appContext, ExampleContentProviderEntryPoint.class); AnalyticsService analyticsService = hiltEntryPoint.analyticsService(); } }
Bu örnekte, giriş noktası SingletonComponent
içine yüklendiğinden giriş noktasını almak için ApplicationContext
öğesini kullanmanız gerekir. Almak istediğiniz bağlama ActivityComponent
içindeyse bunun yerine ActivityContext
öğesini kullanırsınız.
Kabza ve Hançer
Dagger bağımlılık ekleme kitaplığının üzerine inşa edilen Hilt, Dagger'ı bir Android uygulamasına eklemek için standart bir yöntem sunar.
Dagger ile ilgili olarak, Hilt'in hedefleri şunlardır:
- Android uygulamaları için Dagger ile ilgili altyapıyı basitleştirmek üzere.
- Uygulamalar arasında kurulumu, okunabilirliği ve kod paylaşımını kolaylaştırmak için standart bir bileşen ve kapsam grubu oluşturmak için.
- Test, hata ayıklama veya sürüm gibi çeşitli derleme türlerine farklı bağlamalar sağlamanın kolay bir yolunu sağlamak için.
Android işletim sistemi kendi çerçeve sınıflarının çoğunu örneklediği için, bir Android uygulamasında Dagger'ı kullanmak yüksek miktarda ortak metin yazmanızı gerektirir. Hilt, bir Android uygulamasında Dagger'ın kullanımıyla ilgili ortak metin kodunu azaltır. Hilt, aşağıdakileri otomatik olarak oluşturur ve sağlar:
- Başka türlü manuel olarak oluşturmanız gereken Android çerçeve sınıflarını Dagger ile entegre etmeye yönelik bileşenler.
- Hilt'in otomatik olarak oluşturduğu bileşenlerle kullanılacak kapsam ek açıklamaları.
Application
veyaActivity
gibi Android sınıflarını temsil eden önceden tanımlanmış bağlamalar.@ApplicationContext
ve@ActivityContext
'yi temsil eden önceden tanımlanmış niteleyiciler.
Dagger ve Hilt kodu, aynı kod tabanında bir arada bulunabilir. Ancak çoğu durumda, Android'de Dagger'ın tüm kullanımlarını yönetmek için Hilt'i kullanmak en iyi seçenektir. Dagger'ı Hilt'e kullanan bir projeyi taşımak için taşıma rehberini ve Dagger uygulamanızı Hilt codelab'e taşıma başlıklı makaleleri inceleyin.
Ek kaynaklar
Hilt hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.