Hilt: Android용 DI 프레임워크에 대한 가장 짧은 가이드

4656 단어 androidkotlindidagger


저는 한동안 강력하면서도 단순한 종속성 주입 프레임워크(DI)를 찾고 있었습니다. 주위를 둘러본 결과 Koin이 이러한 요구 사항을 충족하는 DI 프레임워크라는 결론을 내렸습니다(물론 제 필요에 따라).

내 생각에 Dagger은 Android의 사실상의 DI 프레임워크이며 강력하고 대중적이지만 단순하다고 할 수는 없습니다. 그런 다음 Hilt이 돌아 왔습니다. 어느 것이 스위트 스팟을 쳤습니다. 거의 Dagger(모든 속도와 컴파일 시간 안전성을 갖추고 있음)이지만 빠르고 쉬운 것으로 개조되었습니다.

귀하의 프로젝트에서 Hilt를 사용하는 방법에 대한 매우 빠른 개요를 제공하려고 노력할 것입니다. 기존 프로젝트 중 하나에서 작업을 수행했으며 빠르게 시작할 수 있어 기뻤습니다.

설정



Hilt는 백그라운드에서 많은 "마술"(예: 코드 생성)을 수행하기 때문에 사용하기 쉽습니다. 이렇게 하려면 해당 주석 프로세서 및 기타 종속 항목을 build.gradle 파일에 추가해야 합니다.

꽤 많은 추가가 필요하므로 official doc을 참조하십시오.

종속성



클래스를 주입 가능하게 만들려면 생성자에 @Inject 주석을 달기만 하면 됩니다.

class MyHelper @Inject constructor() { 
    [...] 
}


이것이 주입될 때마다 새 인스턴스가 생성됩니다. (처음 생성될) 동일한 단일 인스턴스를 주입하려면 @Singleton 로 주석을 추가합니다.

@Singleton
class MyHelper @Inject constructor() { 
    [...] 
}


보기/프래그먼트/활동/보기 모델에 대한 범위 지정도 사용할 수 있습니다( doc ). 이는 주입이 요청될 때 동일한 구성 요소에 있는 경우 동일한 인스턴스가 반환됨을 의미합니다. 예를 들어 다음 클래스는 새 Fragment에서 요청할 때마다 생성됩니다.

@FragmentScoped
class MyHelper @Inject constructor() { 
    [...] 
}


모듈



인터페이스와 구현이 있는 경우 모듈이 필요합니다. 클래스를 인스턴스화하는 방법에 대한 지침으로 생각하십시오. 간단한 인터페이스/구현용@Binds .

@InstallIn(ApplicationComponent::class)
abstract class MyHelperModule {
  @Binds
  abstract fun bindMyHelper(myHelperImpl: MyHelperImpl): MyHelper
}


더 복잡한 "명령"을 사용하려면 @Provides 를 사용하십시오. Context 또는 @ApplicationContext로 주석을 달면 기본적으로 @ActivityContext가 제공됩니다.

@Module
@InstallIn(ApplicationComponent::class)
object MyHelperModule {

  @Provides
  fun provideMyHelper(
    @ApplicationContext context: Context
  ) {
      [...]
      return MyHelper(context)
  }
}


Where you@InstallIn는 위에서 본 범위 지정 주석과 함께 클래스의 새 인스턴스가 생성되고 제공되는 시기를 정의합니다. 예를 들어, 이를 요청하는 각 MyHelper에 대해 Activity의 새 인스턴스를 생성합니다.

@Module
@InstallIn(ActivityComponent::class)
abstract class MyHelperModule {

  @ActivityScoped
  @Binds
  abstract fun bindMyHelper(myHelper: MyHelperImpl): MyHelper
}


의존성 주입



이제 종속성이 무엇인지 정의했습니다. 주입하고 사용할 때입니다.

인스턴스화할 수 있는 클래스의 경우 @Inject를 사용하여 생성자 주입을 사용합니다(위에서 본 것처럼).

class MyHelper @Inject constructor(private val toBeInjected: AnotherHelper) { 
    [...] 
}


귀하가 인스턴스화하지 않은 시스템 클래스(예: 활동, 프래그먼트, 서비스)의 경우 @AndroidEntryPoint , @Injectlateinit 를 사용하여 멤버 주입을 사용하십시오.

@AndroidEntryPoint
class MyActivity : AppCompatActivity() {

  @Inject lateinit var myHelper: MyHelper
  [...]
}


모델 보기



JetpackViewModel을 주입하려면 다른 것이 필요합니다.

먼저 다음additional dependencies을 설치합니다.

그런 다음 생성자에서 일반 @ViewModelInject 대신 @Inject를 사용합니다. 를 주입하려면 @Assisted 로 주석을 추가합니다. 마지막으로 ViewModel 팩토리가 필요하지 않습니다. by viewModels()를 사용하여 Fragment/Activity에서 ViewModel를 검색하십시오.

class MyViewModel @ViewModelInject constructor(
  @Assisted private val savedState: SavedStateHandle,
  private val myHelper: MyHelper,
) : ViewModel() {
  [...]
}


이 짧은 게시물에서 Hilt와 사용 방법을 엿볼 수 있기를 바랍니다. 더 많은 사용 사례를 보려면 doc을 자세히 살펴보십시오. 즐거운 코딩하세요!

좋은 웹페이지 즐겨찾기