Hilt, Android için bir bağımlılık ekleme kitaplığıdır. Projenizde manuel bağımlılık ekleme işleminin ortak metinlerini azaltır. Manuel bağımlılık ekleme işlemini gerçekleştirmek için her sınıfı ve bağımlılarını manuel olarak oluşturmanız ve bağımlılıkları yeniden kullanmak ve yönetmek için kapsayıcıları kullanmanız gerekir.
Hilt, projenizdeki her Android sınıfı için container'lar ve bunların yaşam döngülerini yönetme otomatik olarak oluşturur. Hilt, popüler DI kitaplığının üzerine inşa edilmiştir Dagger derleme zamanı doğruluğu, çalışma zamanı performansı, ölçeklenebilirlik ve Android Studio destek için de geçerli. Daha fazla bilgi için Kılıç ve hançer başlıklı makaleyi inceleyin.
Bu kılavuzda, Hilt ve oluşturulan kapsayıcılarının temel kavramları açıklanmaktadır. Ayrıca, mevcut bir uygulamanın Hilt'i kullanacak şekilde nasıl başlatılacağını gösteren bir gösterim de yer alır.
Bağımlılıklar ekleme
İlk olarak hilt-android-gradle-plugin
eklentisini projenizin kök dizinine ekleyin
build.gradle
dosyası:
plugins { ... id 'com.google.dagger.hilt.android' version '2.51.1' apply false }
plugins { ... id("com.google.dagger.hilt.android") version "2.51.1" apply false }
Ardından Gradle eklentisini uygulayın ve bu bağımlılıkları
app/build.gradle
dosyası:
... plugins { id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } android { ... } dependencies { implementation "com.google.dagger:hilt-android:2.51.1" kapt "com.google.dagger:hilt-compiler:2.51.1" } // Allow references to generated code kapt { correctErrorTypes true }
plugins { id("kotlin-kapt") id("com.google.dagger.hilt.android") } android { ... } dependencies { implementation("com.google.dagger:hilt-android:2.51.1") kapt("com.google.dagger:hilt-android-compiler:2.51.1") } // 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ğıdakileri ekleyin:
android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
android { ... compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } }
Hilt uygulama sınıfı
Hilt kullanan tüm uygulamalar
Ek açıklamalı Application
sınıf
@HiltAndroidApp
.
@HiltAndroidApp
, aşağıdakiler için bir temel sınıf dahil olmak üzere Hilt'in kod oluşturma işlemini tetikler:
işlevi gören bir uygulamaya dayanıyor.
@HiltAndroidApp class ExampleApplication : Application() { ... }
@HiltAndroidApp public class ExampleApplication extends Application { ... }
Oluşturulan bu Hilt bileşeni, Application
nesnesinin yaşam döngüsüne eklenir ve nesne için bağımlılıklar sağlar. Ayrıca, üst öğedir
bileşeni olur. Bu da diğer bileşenlerin
bağımlılıkları
ortaya koyabilir.
Android sınıflarına bağımlılık ekleme
Hilt, Application
sınıfınızda ve uygulama düzeyinde oluşturulduktan sonra
bileşeni kullanıma sunulduğunda, Hilt, diğer Android sınıflarına bağımlılıklar sağlayabilir.
@AndroidEntryPoint
ek açıklamasına sahip olanlar:
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { ... }
@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 not eklerseniz ona bağlı Android sınıflarına da not eklemeniz gerekir. Örneğin, bir snippet'e ek açıklama eklerseniz bu snippet'i 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ık alabilir.
Bir bileşenden bağımlılıkları elde etmek amacıyla, aşağıdaki işlemleri gerçekleştirmek için @Inject
ek açıklamasını kullanın:
alan yerleştirme:
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { @Inject lateinit var analytics: AnalyticsAdapter ... }
@AndroidEntryPoint public class ExampleActivity extends AppCompatActivity { @Inject AnalyticsAdapter analytics; ... }
Hilt'in eklediği sınıflarda da ekleme kullanan başka temel sınıflar olabilir.
Bu sınıflarda @AndroidEntryPoint
ek açıklaması gerekmez
soyut.
Bir Android sınıfının hangi yaşam döngüsü geri çağırmasının yerleştirildiği hakkında daha fazla bilgi edinmek için: Bileşen kullanım ömrü adlı makaleyi inceleyin.
Hilt bağlamalarını tanımlama
Saha yerleştirme işlemi gerçekleştirmek için, Hilt'in bağımlılıklarını ortaya koyabilir. Bağlama bir tür örneği bağımlılık olarak sağlamak için gereken bilgileri içerir.
Hilt'e bağlama bilgilerini sağlamanın bir yolu yapıcı enjeksiyonudur. Hilt'e bir sınıfın örneklerini nasıl sağlayacağını söylemek için sınıfın kurucusundaki @Inject
ek açıklamasını kullanın:
class AnalyticsAdapter @Inject constructor( private val service: AnalyticsService ) { ... }
public class AnalyticsAdapter { private final AnalyticsService service; @Inject AnalyticsAdapter(AnalyticsService service) { this.service = service; } ... }
Bir sınıfın ek açıklamalı oluşturucusunun parametreleri,
anlatacağım. Bu örnekte AnalyticsAdapter
, AnalyticsService
için
desteklenmektedir. Bu nedenle Hilt, AnalyticsService
örneklerini nasıl sağlayacağını da bilmelidir.
Hilt modülleri
Bazen bir tür, kurucu tarafından eklenemez. Bu durum birden fazla neden. Örneğin, bir arayüze oluşturucu ekleme yapamazsınız. Ayrıca sahibi olmadığınız bir türü (örneğin, emin olun. Bu gibi durumlarda, Hilt'e bağlayıcı bilgileri sağlayabilirsiniz. Hilt modüllerini kullanın.
Hilt modülü, @Module
ile ek açıklama eklenmiş bir sınıftır. Hançer gibi
modülünü kullanabilirsiniz,
belirli türlerin nasıl sağlanacağı konusunda Hilt'e bilgi verir. Dagger modüllerinin aksine,
Hilt'e hangi Android telefonunu belirtmek için @InstallIn
ile Hilt modüllerine ek açıklama eklemelisiniz
her modülün kullanılacağı veya yüklendiği sınıfı seçin.
Hilt modüllerinde sağladığınız bağımlılıklar, oluşturulan tüm uygulamanızın yüklü olduğu Android sınıfıyla ilişkili bileşenler Hilt modülü.
@Binds ile arayüz örneklerini ekleme
AnalyticsService
örneğini düşünün. AnalyticsService
bir arayüzse oluşturucu aracılığıyla ekleme yapamazsınız. Bunun yerine, Hilt modülü içinde @Binds
ile ek açıklamalı bir soyut işlev oluşturarak Hilt'e bağlama bilgilerini sağlayın.
@Binds
ek açıklaması, gerektiğinde
arayüzün bir örneğini sağlar.
Notlandırılmış işlev, Hilt'e aşağıdaki bilgileri sağlar:
- Fonksiyon dönüş türü, Hilt'e, işlevin hangi arayüzü sağladığını bildirir örneğidir.
- İşlev parametresi, Hilt'e hangi uygulamanın sağlanacağını bildirir.
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 }
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
içine enjekte etmesini istediğiniz için Hilt modülü AnalyticsModule
, @InstallIn(ActivityComponent.class)
ile ek açıklamaya sahiptir. Bu ek açıklama, sitenizdeki tüm
AnalyticsModule
içindeki bağımlılıklar, uygulamanın tüm etkinliklerinde mevcut.
@Provides ile örnek yerleştirme
Bir tür kurucu ekleyemeyeceğiniz tek durum arayüz değildir.
Sınıfın sahibi siz değilseniz Oluşturucu yerleştirme işlemi de yapılamaz çünkü
harici bir kitaplıktan gelir (
Geriye dönük düzenleme,
OkHttpClient
,
veya Oda veritabanları) kullanabilir veya
oluşturma aracı ile oluşturulabilir
desen.
Önceki örneği inceleyin. AnalyticsService
sınıfının doğrudan sahibi değilseniz Hilt modülü içinde bir işlev oluşturup bu işlevi @Provides
ile ekleyerek Hilt'e bu türün örneklerini nasıl sağlayacağını söyleyebilirsiniz.
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ür örneklerini sağladığını bildirir.
- İşlev parametreleri, Hilt'e ilgili türün bağımlılıklarını bildirir.
- İşlev gövdesi, Hilt'e ilgili türün bir örneğinin nasıl sağlanacağını söyler. Hilt, bu türden bir örnek sağlaması gerektiğinde her zaman işlev gövdesini yürütür.
@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) } }
@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ğlama
Hilt'in, bağımlılıklarla aynı türde farklı uygulamalar sağlaması gerektiğinde Hilt'e birden fazla bağlama sağlamanız gerekir. Şunları yapabilirsiniz: niteleyicilerle aynı tür için birden çok bağlama tanımlamanız gerekir.
Niteleyici, bir öğe için belirli bir bağlamayı tanımlamak üzere reklam türünü eklemeniz gerekir.
Örneği düşünün. AnalyticsService
numaralı telefona yapılan aramalara müdahale etmeniz gerekiyorsa
bir OkHttpClient
nesnesini
yazıcı olarak tanımlar. Diğer hizmetler için aramaları farklı bir şekilde müdahale etmeniz gerekebilir. Bu durumda, Hilt'e OkHttpClient
için iki farklı uygulamanın nasıl sağlanacağını bildirmeniz gerekir.
Öncelikle, @Binds
veya
@Provides
yöntem:
@Qualifier @Retention(AnnotationRetention.BINARY) annotation class AuthInterceptorOkHttpClient @Qualifier @Retention(AnnotationRetention.BINARY) annotation class OtherInterceptorOkHttpClient
@Qualifier @Retention(RetentionPolicy.RUNTIME) private @interface AuthInterceptorOkHttpClient {} @Qualifier @Retention(RetentionPolicy.RUNTIME) private @interface OtherInterceptorOkHttpClient {}
Ardından, Hilt'in buna karşılık gelen türün bir örneğini nasıl sunacağını
tıklayın. Bu durumda, @Provides
ile Hilt modülü kullanabilirsiniz.
Her iki yöntemin de aynı döndürme türü vardır ancak niteleyiciler bunları iki farklı bağlama olarak etiketler:
@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() } }
@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(); } }
İhtiyaç duyduğunuz belirli bir türü, alana not ekleyerek veya parametresini karşılık gelen niteleyiciyle değiştirin:
// 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 }
// 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 nasıl sunabileceğimizi açıklayacağız. Temel veya ortaktan ayrılma bir niteleyici olmadan uygulanması hata olasılığıdır ve Hilt'in en iyi uygulamaları paylaşacağız.
Hilt'te önceden tanımlanmış niteleyiciler
Hilt, önceden tanımlanmış bazı niteleyiciler sağlar. Örneğin, uygulamadan veya etkinlikten Context
sınıfına ihtiyacınız olabileceğinden Hilt, @ApplicationContext
ve @ActivityContext
sınıflarını sağlar.
Örnekteki AnalyticsAdapter
sınıfının etkinliğin bağlamına ihtiyacı olduğunu varsayalım. Aşağıdaki kod, etkinliğin nasıl sağlanacağını gösterir
bağlamı AnalyticsAdapter
öğesine ekleyin:
class AnalyticsAdapter @Inject constructor( @ActivityContext private val context: Context, private val service: AnalyticsService ) { ... }
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 kullanılabilen diğer önceden tanımlanmış bağlamalar için Bileşen varsayılan bağlamaları başlıklı makaleyi inceleyin.
Android sınıfları için oluşturulan bileşenler
Alan ekleme işlemi yapabileceğiniz her Android sınıfı için @InstallIn
ek açıklamalarında referans verebileceğiniz ilişkili bir Hilt bileşeni vardır.
Her bir Hilt bileşeni, bağlamalarını
ilgili Android sınıfını kullanın.
Önceki örneklerde, Hilt modüllerinde ActivityComponent
kullanımı gösterilmiştir.
Hilt aşağıdaki bileşenleri sağlar:
Sap bileşeni | Şunlar için enjeksiyon cihazı: |
---|---|
SingletonComponent |
Application |
ActivityRetainedComponent |
Yok |
ViewModelComponent |
ViewModel |
ActivityComponent |
Activity |
FragmentComponent |
Fragment |
ViewComponent |
View |
ViewWithFragmentComponent |
View , @WithFragmentBindings ile notlandırıldı |
ServiceComponent |
Service |
Bileşen kullanım ömrü
Hilt, oluşturulan bileşen sınıflarının örneklerini otomatik olarak oluşturur ve ilgili Android sınıflarının yaşam döngüsüne göre yok eder.
Oluşturulan bileşen | Oluşturulma zamanı | Kaldırıldığı yer |
---|---|---|
SingletonComponent |
Application#onCreate() |
Application imha edildi |
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ı
Hilt'teki tüm bağlamalar varsayılan olarak kapsamsızdır. Bu, uygulamanız bağlamayı her istediğinde Hilt'in gerekli türün yeni bir örneğini oluşturduğu anlamına gelir.
Örnekte, Hilt her AnalyticsAdapter
türünü başka bir türe bağımlı olarak veya alan ekleme yoluyla (ExampleActivity
'te olduğu gibi) sağladığında yeni bir AnalyticsAdapter
örneği sağlar.
Ancak Hilt, bağlamanın belirli bir bileşenle sınırlandırılmasına da olanak tanır. Hilt, bağlamanın kapsamına alındığı bileşen örneği başına yalnızca bir kez kapsamlı bağlama oluşturur ve bu bağlama yönelik tüm istekler aynı örneği paylaşır.
Aşağıdaki tabloda, oluşturulan her bileşenin 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çıklamalı |
ViewWithFragmentComponent |
@ViewScoped |
Service |
ServiceComponent |
@ServiceScoped |
Örnekte, @ActivityScoped
kullanarak AnalyticsAdapter
'ü ActivityComponent
'e göre kapsamlandırırsanız Hilt, ilgili etkinliğin ömrü boyunca aynı AnalyticsAdapter
örneğini sağlar:
@ActivityScoped class AnalyticsAdapter @Inject constructor( private val service: AnalyticsService ) { ... }
@ActivityScoped public class AnalyticsAdapter { private final AnalyticsService service; @Inject AnalyticsAdapter(AnalyticsService service) { this.service = service; } ... }
AnalyticsService
'ün, yalnızca ExampleActivity
'te değil, uygulamanın her yerinde her zaman aynı örneğin kullanılmasını gerektiren dahili bir durumuna sahip olduğunu varsayalım. Bu durumda, AnalyticsService
'ü SingletonComponent
olarak kapsamlandırmak uygundur. Sonuç olarak, bileşenin görevini tamamlaması gerektiğinde
bir AnalyticsService
örneği sağlar. Her seferinde aynı örneği sağlar.
gerekir.
Aşağıdaki örnek,
Hilt modülü. Bağlantının kapsamı, yüklendiği bileşenin kapsamıyla eşleşmelidir. Bu nedenle, bu örnekte AnalyticsService
'ü ActivityComponent
yerine SingletonComponent
içine yüklemeniz gerekir:
// 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) } }
// 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 başlıklı makaleyi inceleyin.
Bileşen hiyerarşisi
Bir modülü bir bileşene yüklediğinizde, bu modülün bağlamalarına, bileşen hiyerarşisinde bu bileşendeki veya altındaki herhangi bir alt bileşendeki diğer bağlamaların bağımlılığı olarak erişilebilir:
Bileşen varsayılan bağlamaları
Her Hilt bileşeni, Hilt'in kendi özel bağlamalarınıza bağımlılık olarak ekleyebildiği bir dizi varsayılan bağlama ile birlikte gelir. Bu bağlamaların belirli bir alt sınıfa değil, genel etkinlik 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 yardımcı olur. Her etkinliğin bu bileşenin farklı bir örneği vardır.
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ğlama, @ApplicationContext
ile de kullanılabilir.
Örnek:
class AnalyticsServiceImpl @Inject constructor( @ApplicationContext context: Context ) : AnalyticsService { ... } // The Application binding is available without qualifiers. class AnalyticsServiceImpl @Inject constructor( application: Application ) : AnalyticsService { ... }
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 yapılabilir. Örneğin,
örnek:
class AnalyticsAdapter @Inject constructor( @ActivityContext context: Context ) { ... } // The Activity binding is available without qualifiers. class AnalyticsAdapter @Inject constructor( activity: FragmentActivity ) { ... }
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ı için destek içerir. Ancak Hilt'in desteklemediği sınıflarda alan ekleme işlemi yapmanız gerekebilir.
Bu gibi durumlarda, @EntryPoint
ek açıklamasını kullanarak bir giriş noktası oluşturabilirsiniz. Giriş noktası, Hilt tarafından yönetilen kod ile yönetilmeyen kod arasındaki sınırdır. Kod, grafiğin
nesneleri sayacağım. Giriş noktaları, Hilt'in bağımlılık grafiğinde bağımlılık sağlayamadığı kodu kullanmasına olanak tanır.
Örneğin, Hilt, tüm içeriklerin
sağlayıcılarını ziyaret edin. Belirli bir içeriği
bağımlılıklarını öğrenmek için Hilt'i kullanmasını istiyorsanız, bir arayüz tanımlamanız gerekir.
ve istediğiniz her bağlama türü için @EntryPoint
ile ek açıklamalı bir
niteleyicileri dahil edin. Ardından, içinde yer alacak bileşeni belirtmek için @InstallIn
ekleyin
giriş noktasını aşağıdaki gibi yükleyin:
class ExampleContentProvider : ContentProvider() { @EntryPoint @InstallIn(SingletonComponent::class) interface ExampleContentProviderEntryPoint { fun analyticsService(): AnalyticsService } ... }
public class ExampleContentProvider extends ContentProvider { @EntryPoint @InstallIn(SingletonComponent.class) interface ExampleContentProviderEntryPoint { public AnalyticsService analyticsService(); } ... }
Bir giriş noktasına erişmek için
EntryPointAccessors
Parametre, bileşen örneği veya bileşen tutucusu olarak işlev gören @AndroidEntryPoint
nesnesi olmalıdır. Parametre olarak ilettiğiniz bileşenin ve EntryPointAccessors
statik yönteminin, @EntryPoint
arayüzündeki @InstallIn
ek açıklamalarındaki Android sınıfıyla eşleştiğinden emin olun:
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() ... } }
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şi almak için ApplicationContext
kullanmanız gerekir
çünkü giriş noktası SingletonComponent
üzerinde yüklü. Almak istediğiniz bağlama ActivityComponent
içinde yer verilecekse bunun yerine ActivityContext
kullanılır.
Kılıç sapı ve hançer
Hilt, Dagger'ın (Dagger) bağımlılık ekleme kitaplığıyla, Dagger'ı dahil etmek için standart bir yöntem sunar. bir Android uygulamasına dönüştürülebilir.
Dagger ile ilgili olarak, Hilt'in hedefleri aşağıdaki gibidir:
- Android uygulamaları için Dagger ile ilgili altyapıyı basitleştirmek.
- Kurulumu, okunabilirliği ve okunabilirliği kolaylaştırmak amacıyla standart bir bileşen ve kapsam grubu oluşturmak için ve uygulamalar arasında kod paylaşımı.
- Test, hata ayıklama veya sürüm gibi çeşitli derleme türlerine farklı bağlamalar sağlamanın kolay bir yolunu sunmak için.
Çünkü Android işletim sistemi, kendi çerçevesinin çoğunu örneklendirir. kullanıyorsanız, bir Android uygulamasında Dagger'ı kullanmak için bir şablondur. Hilt, bir projeye dahil olan ortak bir Android uygulamasında Dagger kullanarak. Hilt, aşağıdakileri otomatik olarak oluşturur ve sağlar:
- Android çerçeve sınıflarını Dagger ile entegre etmeye yönelik bileşenler manuel olarak oluşturulması gerekir.
- Hilt'in oluşturduğu bileşenlerle kullanılacak kapsam ek açıklamaları otomatik olarak oluşturur.
Application
gibi Android sınıflarını temsil edecek önceden tanımlanmış bağlamalar veyaActivity
.@ApplicationContext
ve@ActivityContext
'ı temsil eden önceden tanımlanmış nitelikler.
Dagger ve Hilt kodu aynı kod tabanında birlikte bulunabilir. Ancak çoğu durumda, Android'de Dagger'ı kullanmanızın tamamını yönetmek için Hilt'i kullanmak en iyisidir. Taşımak için kullanan bir projeyseniz, daha fazla bilgi için taşıma kılavuzu ve Taşıma ve Dagger uygulamanızı Hilt'e codelab'de bulabilirsiniz.
Ek kaynaklar
Hilt hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.
Örnekler
Codelab uygulamaları
Bloglar
- Hilt ile Android'de bağımlılık ekleme
- Android ve Sap
- Hilt hiyerarşisine bileşen ekleme
- Google I/O uygulamasını Sap