반응형
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를 주입받아 사용할 수 있다.
반응형
'안드로이드' 카테고리의 다른 글
오픈소스 라이선스 만들기 (0) | 2021.02.23 |
---|---|
Error ) NavigationExtensions - does not have a NavController set (0) | 2021.02.03 |
ViewModel - SavedStateHandle (0) | 2021.01.24 |
Retrofit - 세션 유지하기 (0) | 2021.01.06 |
Error ) ViewPager2 - onAttachedToRecyclerView (0) | 2021.01.03 |