Hilt 2.31 버전 이후로, AssistedInject란 기능이 새로 생겼습니다.
기존 Hilt를 사용했을 땐, 미리 명시된 의존 Graph에서 명시적으로 정의된 Module만을 주입 받을 수 있었는데, AssistedInject 기능을 통해
기존 Dagger2처럼 런타임에도 Object 주입이 가능하게 되었습니다.
@AssistedFactory
어노테이션을 통해AssistedFactory
를 정의해주고, 그 안에서 parameter로 우리가 동적으로 전달할 객체를 명시해줍니다.- 그리고 Line 12 ~20에 명시된 것 처럼,
ViewModelProvider
를 정의해주고 그 내부에서 parameter로 1번에서 정의한AssistedFactory
와 전달하고자 하는 객체를 전달해줘,ViewModelProvider
내부에서AssistedFactory
객체를 호출하는 형태로 구현합니다.
여기까진 기존 Dagger2의 방법과 유사한데요. 주의할 점은 AssistedInject 기능을 사용하려면 기존 ViewModel
상단에 정의한 @HiltViewModel
을 정의하면 안되며,
기존 @Inject
어노테이션이 아닌, @AssistedInject
어노테이션을 Constructor에 달아줘야 합니다.
그리고 기존 Graph Module이 아닌, AssistedFactory
를 통해 객체 주입 받는다는 것을 명시하기 위해 AssistedFactory
를 통해 주입받는 객체에 @Assisted
를 달아줍니다.
이렇게 해줌으로써, 위 코드에 정의된 movieListUsecase
, movieDetailUseCase
는 미리 정의한 Graph의 모듈을 통해 주입받으며, @Assisted
어노테이션이 달린 contextWrapper는 AssistedFactory
를 통해 주입받습니다.
다음은Activity
에서, 앞서 정의한 AssistedFactory
와 ViewModelProvider
를 사용하여, ViewModel
을 생성하는 방법입니다.
3. Activity
/Fragment
에서, 앞서 ViewModel
에서 정의한 AssistedFactory
를 주입받고 (@AssistedFactory
어노테이션이 달려 있으면 주입가능)
4. viewModels
라는 ViewModel
생성 Delegator를 통해 앞서 정의한ViewModelProvider
를 호출해줌으로써, 동적으로 Activity
/Fragment
가 Hilt를 이용해 ViewModel
에게 특정 Object를 주입해줄 수 있습니다.
AssistedInject를 통해 Module Inject에서 처리할 수 없는 Activity/Fragment의 Context를 지닌 작업들을 처리할 수 있습니다. (ex — Dialog)
Dialog Wrapping Object를 생성하여 ViewModel에게 전달해주면 ViewModel은 그 Wrapping 객체와 Interaction하여 Positive/Negative 클릭에 대한 처리도 모두 ViewModel 안에서 이뤄지게 할 수 있습니다.
기타 이외에도 동적으로 ViewModel에게 전달해줘야 할 Object가 있다면, Setter를 이용하는 것이 아닌 AssistedInject를 사용해보시길 권장 드립니다.