본문 바로가기

안드로이드

Dagger ( Hilt ) 2.31 - 변경된 ViewModel 주입

반응형

Hilt 2.31에서 ViewModel 주입 방법이 바뀌었다.

기존 코드

implementation "com.google.dagger:hilt-android:2.30.1-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.30.1-alpha"
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'


class StartViewModel @ViewModelInject constructor(
    @Assisted private val savedStateHandle: SavedStateHandle,
    private val checkServerStatus: CheckServerStatus
) : BaseViewModel() {

}

 

바뀐 코드

이제는 androidx.hilt:hilt-lifecycle-viewmodel 라이브러리 없이도

hilt 에서 제공하는 @HiltViewModel 를 통해서 가능하다.

implementation "com.google.dagger:hilt-android:2.31.2-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.31.2-alpha"
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'


@HiltViewModel
class StartViewModel @Inject constructor(
    private val savedStateHandle: SavedStateHandle,
    private val checkServerStatus: CheckServerStatus
) : BaseViewModel() {

}

@AndroidEntryPoint 와 동일한 방식으로 주입을

선언할 수 있게 변경되었고,

@Assisted 없이도 SavedStateHandle 를 주입받을 수 있다.

@Module
@InstallIn(ViewModelComponent::class)
internal class RepositoryModule {

    @Provides
    @ViewModelScoped
    fun provideTestRepository(handle: SavedStateHandle): TestRepository =
        TestRepositoryImpl(handle.get<String>("id"))

    // SavedStateHandle 를 통한 주입이 가능해짐
    // 첫 화면 노출시에는 `handle.get<String>("id")` 에 값이 없다.
    // 화면이 죽었다 살아난 경우 값이 있는걸 확인 할 수 있다.
}

@HiltViewModel
class TestViewModel @Inject constructor(
    private val savedStateHandle: SavedStateHandle,
    private val testRepository: TestRepository
) : BaseViewModel() { 

    override fun onCleared() {
        savedStateHandle.set("Id", targetId)
        super.onCleared()
    }
}

 

@ViewModelComponent@ViewModelScoped 가 추가되었고,

둘 다 사용한 경우에 위와 같이

ViewModel의 SavedStateHandle를 주입받아 사용할 수 있다.

 

반응형