Hilt: 맞춤 진입점

2638 단어 android


Hilt은 Android용 훌륭한 종속성 주입 프레임워크입니다. Dagger의 모든 강점을 가지고 있으며 .

Android 클래스에 @AndroidEntryPoint 주석만 추가하면 마술처럼 @Inject 주석이 달린 클래스 구성원이 삽입됩니다.
@AndroidEntryPoint 주석supports injection은 활동, 프래그먼트, 보기, 서비스 및 BroadcastReceivers와 같은 일부 기본 시스템 클래스에만 적용됩니다. 그러나 주사는 당신에게 마법입니다. 시스템 클래스를 주입하는 것을 볼 수 없습니다. 시스템 클래스(또는 사용자가 인스턴스화하지 않은 모든 항목)를 만났지만 주입해야 하는 경우 어떻게 됩니까?

(Jetpack의 라이브러리에서) 내 Initializer 클래스를 삽입해야 한다는 사실을 알게 되었을 때 Hilt로 마이그레이션할 때 직면한 상황입니다. 여기에서 사용자 지정 진입점이 작동합니다.

진입점 인터페이스



제어할 수 없는 클래스에 대해 무엇@Inject을 하시겠습니까? 이@EntryPoint 주석 인터페이스에 "접속자"메소드를 추가하여 인스턴스를 가져옵니다.

@EntryPoint
@InstallIn(SingletonComponent::class)
interface InitializerEntryPoint {
    fun myHelper(): MyHelper
}


주입된 인스턴스가 속한 동일한 항목component에 이것을 "설치"해야 한다는 점에 유의하십시오. 따라서 활동 범위 및 싱글톤 범위일 수 있는 인스턴스가 필요한 경우 둘 이상의 진입점 인터페이스가 필요할 수 있습니다.

진입점 인터페이스를 어디에 추가합니까?



official docs 에 따르면 이상적으로 이러한 인터페이스는 제공하는 개체가 아니라 사용되는 개체에 가까워야 합니다. 예를 들어 Jetpack의 앱 시작Initializer 예제에서 이러한 인터페이스는 이니셜라이저 내부에 정의되어야 합니다.

class MyCoolInitializer : Initializer<Unit> {

    [...]

    @EntryPoint
    @InstallIn(SingletonComponent::class)
    interface InitializerEntryPoint {
        fun myHelper(): MyHelper
    }
}



이것은 이러한 진입점 인터페이스가 @Inject -ed될 수 없는 특수한 경우 클래스에 대해서만 존재한다는 것을 분명히 하기 위한 것입니다. 다른 모든 경우에는 표준@Inject@AndroidEntryPoint 주석을 사용해야 합니다.

사용 방법



마지막으로 이러한 진입점 인터페이스를 사용하려면 정적 Hilt 메서드를 사용하고 해당 "접근자"메서드에 액세스하여 인스턴스를 가져옵니다!

val myHelper = EntryPoints.get(applicationContext, InitializerEntryPoint::class.java).myHelper()



즐거운 코딩하세요!

좋은 웹페이지 즐겨찾기