Hilt ile bağımlı yerleştirme

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ı:

EskiKotlin
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ı:

GroovyKotlin
...
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:

EskiKotlin
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.

KotlinJava
@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:

KotlinJava
@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:

KotlinJava
@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:

KotlinJava
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.
KotlinJava
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.
KotlinJava
@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:

KotlinJava
@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:

KotlinJava
@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:

KotlinJava
// 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:

KotlinJava
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 AnalyticsAdapterActivityComponent'e göre kapsamlandırırsanız Hilt, ilgili etkinliğin ömrü boyunca aynı AnalyticsAdapter örneğini sağlar:

KotlinJava
@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, AnalyticsServiceSingletonComponent 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 AnalyticsServiceActivityComponent yerine SingletonComponent içine yüklemeniz gerekir:

KotlinJava
// 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:

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, SingletonComponent altındadır.
Şekil 1. Hilt'in oluşturduğu bileşenlerin hiyerarşisi.

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:

KotlinJava
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:

KotlinJava
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:

KotlinJava
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:

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

Hiçbir sonuç bulunamadı.

Codelab uygulamaları

Bloglar