https://dagger.dev/hilt/creating-extensions


모듈과 Entry point 생성하기

Hilt는 표준 컴포넌트와 클래스 경로에서 모듈 및 Entry point가 선택되는 방식으로 인해 Hilt와 통합하려는 확장(extension) 또는 라이브러리에 특히 적합하다.

그러나, @InstallIn 모듈을 생성하는 확장 또는 Entry point는 Hilt가 올바르게 선택할 수 있도록 생성된 클래스에 추가 정보를 넣어야 한다.

@GeneratesRootInput

Hilt는 클래스 경로에서 모듈과 Entry point를 암시적으로 선택하기 때문에, Dagger 컴포넌트를 생성하기 전에 확장이 코드를 생성 할 때까지 기다려야 하는지 알기 위한 추가 정보가 필요하다. 이것은 코드 생성을 트리거하는 어노테이션 클래스에 @GeneratesRootInput을 달아서 수행된다.

예를 들어, 누군가 @GenerateMyModule 어노테이션을 사용할 때마다 확장에서 모듈을 생성 한 경우, @GenerateMyModule 어노테이션을 다음과 같이 사용해야 한다.

@GeneratesRootInput annotation class GenerateMyModule {}

어노테이션을 달지 않는다고 해서, Hilt가 반드시 모듈을 놓치는 것은 아니다. 다른 항목이 생성되기를 기다리는 경우에도 여전히 모듈을 챙길수 있기 때문이다. 이것도 물론 신뢰할 수 없다.

@OriginatingElement

테스트 페이지에 설명 된대로 테스트의 내재된 모듈은 테스트를 둘러싸는 곳에 격리된다. 그러나 테스트를 위해 생성 된 모듈은 내재된 클래스로 생성 될 수 없다. 이를 올바르게 지원하려면 생성된 코드에 최상위 클래스가 값인 @OriginatingElement 어노테이션을 달아야 한다. 내재된 계층이 많을 수 있으므로 이 클래스는 항상 클래스와 동일하진 않다.

예를 들어, 확장은 다음 코드에 의해 트리거 되고 FooTest_FooModule이라는 모듈을 생성한다고 가정하자.

@HiltAndroidTest
class FooTest {
    @GenerateMyModule
    val foo: Foo = Foo()
    ...
}

그런 다음 생성된 FooTest_FooModule에 다음과 같이 어노테이션을 달아야 한다.

 

@HiltAndroidTest
class FooTest {
    @GenerateMyModule
    val foo: Foo = Foo()
    ...
}

 

카테고리: Dagger2

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.