경험의 기록

2021.06.03 - [안드로이드/AAC, MVVM] - [Android] Dagger Hilt 사용하여 의존성 주입(DI) 하기

 

[Android] Dagger Hilt 사용하여 의존성 주입(DI) 하기

0️⃣ 의존성 주입(DI) 이란? 먼저, 의존성이란 A 클래스가 자체적인 B 클래스를 구성하는 것을 말한다. 구글의 예시를 통해 알아보자. 그림과 같이 Car라는 클래스가 Engine 라는 클래스를 가져다 쓰

hanyeop.tistory.com

 

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 

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading