Hilt ile bağımlı yerleştirme

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.

tıklayın.

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:

ViewWithFragmentComponent, FragmentComponent altındadır. Parça Bileşeni
    ve ViewComponent'ın altında bulunan kanallardır. Etkinlik Bileşeni şunun altında:
    ActivityRetainedComponent'ı tıklayın. ViewModelBileşeni şunun altında:
    ActivityRetainedComponent'ı tıklayın. ActivityRetainedComponent ve ServiceComponent
    SingletonBileşeni'nin altındadır.
Şekil 1. Hilt'in devreye soktuğu bileşenlerin hiyerarşisi oluşturuyor.

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 veya Activity.
  • @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