AssistedInject
에 대해서 알아보려고 한다.
기존 Hilt를 사용했을 때는 미리 명시된 의존 Graph에서 명시적으로 정의된 Module만을 주입받을 수 있었다. 하지만, AssistedInject
를 통해서 런타임에 주입이 가능하다.
class HomeViewModel @AssistedInject constructor(
@Assisted initialState: HomeState,
private val getHomeDataUseCase: GetHomeDataUseCase,
private val modelMapper: ModelMapper,
private val networkHelper: NetworkHelper
) : MavericksViewModel<HomeState>(initialState) {
@AssistedFactory
interface Factory : AssistedViewModelFactory<HomeViewModel, HomeState> {
override fun create(state: HomeState): HomeViewModel
}
companion object : MavericksViewModelFactory<HomeViewModel, HomeState> by hiltMavericksViewModelFactory()
}
@Module
@InstallIn(MavericksViewModelComponent::class)
interface ViewModelModule {
@Binds
@IntoMap
@ViewModelKey(HomeViewModel::class)
fun homeViewModelFactory(factory: HomeViewModel.Factory): AssistedViewModelFactory<*, *>
}
AssistedInject 기능을 사용하려면 @HiltViewModel
을 사용하면 안되며, @Inject
어노테이션이 아닌 @AssistedInject
어노테이션을 Constructor에서 사용해야 한다.
그리고 기존 Graph Module이 아니라 AssistedFactory를 통해 객체를 주입받는다는 것을 명시하기 위해 AssistedFactory를 통해 주입받는 객체에 @Assisted
어노테이션을 추가해준다.
이렇게 함으로써 getHomeDataUseCase
, modelMapper
, networkHelper
는 미리 정의한 Graph의 모듈을 통해 주입받으며, @Assisted
어노테이션이 달린 initialState는 AssistedFactory
를 통해 주입받는다.
이렇게 함으로써 Hilt는 ViewModel에게 특정 Object를 동적으로 주입해줄 수 있게 된다.
따라서 동적으로 ViewModel에게 객체를 주입할 상황이 생긴다면 AssistedInject
를 활용해보자.