2021.06.03 - [안드로이드/AAC, MVVM] - [Android] Dagger Hilt 사용하여 의존성 주입(DI) 하기
ViewModel 주입
기존
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'
class MyViewModel @ViewModelInject constructor(
@Named("String2") string2 : String
) : ViewModel(){
init{
Log.d("test5", "$string2")
}
}
기존에는 뷰모델에 의존성 주입을 할때
위와 같이 뷰모델 종속성을 추가하고 @ViewModelInject를 사용했다.
최근
@HiltViewModel
class MyViewModel @Inject constructor(
@Named("String2") string2 : String
) : ViewModel(){
init{
Log.d("test5", "$string2")
}
}
하지만 최근 버전에서는
@HiltViewModel 어노테이션을 사용하여 별도의 hilt viewmodel 종속성 추가 없이 의존성 주입을 할 수 있다.
SavedStateHandle
ViewModel을 사용할 경우
화면 회전등의 활동에서 데이터가 저장되지 않는 문제점을 해결할 수 있었다.
하지만 ViewModel 은 메모리 상에 존재하므로 프로세스가 종료될 경우 사라진다.
SavedStateHandle 을 사용하면
사용하지 않아 OS에서 Kill 하는 프로세스에 대한 처리를 할 수 있다.
@HiltViewModel
class GalleryViewModel @Inject constructor(
private val repository: KakaoRepository,
state : SavedStateHandle
) : ViewModel() {
private val currentQuery = state.getLiveData(CURRENT_QUERY,DEFAULT_QUERY)
companion object {
private const val CURRENT_QUERY = "current_query"
private const val DEFAULT_QUERY = "페이커"
}
}
SavedStateHandle 를 생성해주고
state를 getLiveData로 불러올 값, 디폴트 값을 지정해주면
값이 없을 경우 두번째 파라미터 값을 불러오고, 있으면 처음 파라미터 값을 불러온다.
LiveData 값을 변경하면 자동으로 savedStateHandle 값이 갱신된다.
또한,
SavedStateHandle 에서도 기존엔 @Assisted 어노테이션을 사용해야 했으나
이후 버전에서 사라졌다.
참고
https://developer.android.com/topic/libraries/architecture/saving-states?hl=ko