Hilt, Android için ortak metni azaltan bir bağımlılık yerleştirme kitaplığıdır en iyi uygulamaları paylaştık. Manuel bağımlılık yapmak yerleştirme işlemi, her sınıfı ve bağımlılıklarını elle kontrol edip container'ları kullanarak ve yönetmeyi öğreneceksiniz.
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 bkz. Hilt ve Hançer.
Bu kılavuzda, Hilt'in temel kavramları ve oluşturduğu kapsayıcılar açıklanmaktadır. Google Ayrıca, Hilt'i kullanmak için mevcut bir uygulamanın nasıl önyükleneceğine dair bir tanıtım da içeriyor.
Bağımlılık ekleme
İlk olarak hilt-android-gradle-plugin
eklentisini projenizin kök dizinine ekleyin
build.gradle
dosyası:
Eski
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 bu bağımlılıkları
app/build.gradle
dosyası:
Eski
... 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 { id("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. Java 8'i etkinleştirmek için
app/build.gradle
dosyasına aşağıdaki kodu ekleyin:
Eski
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 kullanan tüm uygulamalar
Ek açıklamalı Application
sınıf
@HiltAndroidApp
.
@HiltAndroidApp
,
işlevi gören bir uygulamaya dayanıyor.
Kotlin
@HiltAndroidApp class ExampleApplication : Application() { ... }
Java
@HiltAndroidApp public class ExampleApplication extends Application { ... }
Oluşturulan bu Hilt bileşeni, Application
nesnesinin
ve ona bağımlılık
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:
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
ve bunlara bağımlı Android sınıflarına ek açıklama ekler. Örneğin, bir
parçasını kullandığınız tüm etkinliklere de ek açıklama
olabilir.
@AndroidEntryPoint
, her Android için ayrı bir Hilt bileşeni oluşturur
ekleyebilirsiniz. Bu bileşenler kendi departmanlarından
Bileşen" bölümünde açıklandığı şekilde ilgili üst sınıfları
hiyerarşik olarak düzenlenmiştir.
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:
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ştirme tekniğini de kullanan başka temel sınıflara sahip 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 oluşturucu yerleştirmedir. Tekliflerinizi otomatikleştirmek ve optimize etmek için
@Inject
ek açıklamasına bir sınıfın oluşturucusuna eklemek için
şu sınıfın örneklerini sağlayı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,
görebilirsiniz. Bu örnekte AnalyticsAdapter
, AnalyticsService
için
desteklenmektedir. Bu nedenle, Hilt aynı zamanda yüksek kaliteli
AnalyticsService
Hilt modülleri
Bazen bir tür, kurucu tarafından yerleştirilemez. 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
ek açıklamasına sahip bir sınıftır. Hançer gibi
modülünü kullanabilirsiniz,
belirli türlerin nasıl verileceği 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ü.
Arayüz örneklerini @Binds ile ekleyin
AnalyticsService
örneğini düşünün. AnalyticsService
bir arayüzse
bunu oluşturucu enjekte edemezsiniz. Bunun yerine, Hilt'e bağlantıyı sağlayın
@Binds
ile not eklenmiş soyut bir fonksiyon oluşturarak
Hilt modülü.
@Binds
ek açıklaması, gerektiğinde
bir arayüzün örneğini sağlar.
Ek açıklamalı 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 uygulamayı sağlayacağı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 modülü AnalyticsModule
@InstallIn(ActivityComponent.class)
çünkü Hilt'in
ExampleActivity
değerlerine bağlıyor. 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 de yapılamaz çünkü
harici bir kitaplıktan gelir (
Geriye dönük uygunluk,
OkHttpClient
,
veya Oda veritabanları) kullanabilir veya
oluşturma aracı ile oluşturulabilir
desen.
Bir önceki örneği inceleyelim. AnalyticsService
alanının sahibi doğrudan değilseniz
bir örnek oluşturarak, Hilt'e bu tür örnekleri nasıl sağlayacağını
işlevini kullanmak ve bu işleve @Provides
ile not eklemek.
Ek açıklamalı işlev, Hilt'e aşağıdaki bilgileri sağlar:
- İşlev dönüş türü, Hilt'e, işlevin ne tür örnekler sağladığını bildirir .
- İşlev parametreleri, Hilt'e ilgili türün bağımlılıklarını bildirir.
- Fonksiyon gövdesi, Hilt'e ilgili öğenin bir örneğini nasıl sağlayacağını türü. Hilt, bir fonksiyon gövdesini çalıştırması gerektiğinde işleyeceğiz.
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 çok bağlama sağlayın
Aynı etiketin farklı uygulamalarını sağlamak için Hilt'e ihtiyaç türünü bağımlı olarak kullanmak isterseniz Hilt'e birden çok 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 kullandığınız 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. Örneğin,
diğer hizmetlerde ise aramalara farklı bir şekilde müdahale etmeniz gerekebilir. Bu
Hilt'e, bu iki farklı uygulama için nasıl
OkHttpClient
Öncelikle, @Binds
veya
@Provides
yöntem:
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 buna karşılık gelen türün bir örneğini nasıl sunacağını
tıklayın. 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 yöntem olarak etiketler
kullanın:
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(); } }
İhtiyaç duyduğunuz belirli bir türü, alana not ekleyerek veya parametresini karşılık gelen niteleyiciyle değiştirin:
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 nasıl sunabileceğimizi açıklayacağız. Temelden 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, ekip üyeleri için
Context
sınıfını kullanmak istiyorsanız Hilt,
@ApplicationContext
ve @ActivityContext
elemeleri.
Örnekteki AnalyticsAdapter
sınıfının
etkinliği tıklayın. Aşağıdaki kod, etkinliğin nasıl sağlanacağını gösterir
bağlamı AnalyticsAdapter
öğesine ekleyin:
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 kullanılabilen diğer önceden tanımlanmış bağlamalar için Bileşen varsayılanı" bölümüne bakın bağlama 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 bir vardır.
@InstallIn
ek açıklamasında başvurabileceğiniz ilişkili Hilt bileşeni.
Her bir Hilt bileşeni, bağlamalarını
ilgili Android sınıfını kullanın.
Önceki örnekler, Hilt'te ActivityComponent
kullanımını göstermektedir
modüllerinde yer alır.
Hilt aşağıdaki bileşenleri sağlar:
Sap bileşeni | Ekleyici: |
---|---|
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 kaldırır adımları uygulayın.
Oluşturulan bileşen | Oluşturulma zamanı | Yıkıldığı tarih: |
---|---|---|
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ın kapsamı kaldırılır. Bu, her dönüşüm işleminizde bağlama isteğinde bulunduğunda Hilt, gerekli türde yeni bir örnek oluşturur.
Bu örnekte, Hilt her defasında AnalyticsAdapter
eklentisine bağımlılık olarak
veya alan yerleştirme yoluyla (ExampleActivity
olduğu gibi) Hilt,
yeni bir AnalyticsAdapter
örneği.
Bununla birlikte, Hilt, bağlamanın belirli bir bileşene ayarlanmasına da olanak tanır. Sap Hedefin etkinleştirileceği bileşenin her örneği için yalnızca bir bağlamanın kapsamındadır 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 notlandırıldı |
ViewWithFragmentComponent |
@ViewScoped |
Service |
ServiceComponent |
@ServiceScoped |
Örnekte, AnalyticsAdapter
kapsamını ActivityComponent
öğesine ayarlarsanız
@ActivityScoped
kullanıldığında Hilt, aynı AnalyticsAdapter
örneğini sağlar.
(etkinlik süresi boyunca):
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, aynı
Böylece her seferinde ExampleActivity
değil, aynı zamanda dünyanın her yerinde kullanılacak.
görebilirsiniz. Bu durumda, AnalyticsService
kapsamının
SingletonComponent
. 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ü. Bir bağlamanın kapsamı, bulunduğu bileşenin kapsamıyla eşleşmelidir
Bu örnekte, AnalyticsService
mağazasına
ActivityComponent
yerine SingletonComponent
:
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.
Bileşen hiyerarşisi
Bir bileşene modül yüklemek, onun bağlamalarına bir bileşen söz konusu bileşendeki veya aşağıdaki herhangi bir alt bileşendeki diğer bağlamaların bağımlılığı bunu bileşen hiyerarşisinde bulabilirsiniz:
Bileşen varsayılan bağlamaları
Her Hilt bileşeni, Hilt'in kendi özel bağlamalarınıza eklemeniz gerekir. Bu bağlamaların ve parça türlerine izin verir. Bunun nedeni, Hilt'in tüm etkinlikleri eklemek için tek bir etkinlik bileşeni yardımcı olur. Her etkinlikte 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:
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 yapılabilir. Örneğin,
örnek:
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ı için destek içerir. Ancak, Hilt'in desteklemediği sınıflarda alan yerleştirme işlemi gerçekleştirmeniz gerekir.
Böyle durumlarda, @EntryPoint
öğesini kullanarak bir giriş noktası oluşturabilirsiniz
ek açıklaması da yer alır. Giriş noktası, Hilt tarafından yönetilen kod arasındaki sınırdır
olmayan bir kodu kullanabilirsiniz. Kod, grafiğin
nesneleri sayacağım. Giriş noktaları, Hilt'in kullandığı kodu kullanmasına izin veriyor
bağımlılık grafiğinde
bağımlılık sağlayamıyorsunuz.
Ö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 kullanmak isterseniz, bir arayüz
ve istediğiniz her bağlama türü için @EntryPoint
ile ek açıklamalı bir
niteleyicileri dahil edin. Ardından, içinde bulunulacak bileşeni belirtmek için @InstallIn
ekleyin
giriş noktasını aşağıdaki gibi yükleyin:
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
Bu parametre bileşen örneği veya
bileşen tutucu olarak işlev gören @AndroidEntryPoint
nesnesi. Şunlardan emin olun:
bileşen olarak iletilen bileşeni ve EntryPointAccessors
statik
yöntemindeki @InstallIn
ek açıklamasındaki Android sınıfı,
@EntryPoint
arayüzü:
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şi almak için ApplicationContext
kullanmanız gerekir
çünkü giriş noktası SingletonComponent
üzerinde yüklü. Öğe
ActivityComponent
içinde olsaydınız bunu göz önünde
bunun yerine ActivityContext
kullanın.
Kaçak 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ı.
- Çeşitli derleme türlerine farklı bağlamalar sağlamanın kolay bir yolunu sağlamak için kullanma gibi işlevleri vardır.
Çü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, otomatik olarak şunları 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 niteleyicileri temsil edecek önceden tanımlanmış niteleyiciler@ActivityContext
.
Dagger ve Hilt kodu, aynı kod tabanında bir arada bulunabilir. Ancak çoğu durumda Android'de Dagger kullanımınızı yönetmek için en iyisi Hilt'i kullanmaktır. 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'ler
Bloglar
- Google Ads ile Android'de Bağımlılık Yerleştirme Sap
- Android ve Sap
- Hilt'e bileşen ekleme hiyerarşi
- Google I/O uygulamasını Sap