Development record of developer who study hard everyday.

레이블이 힐트뷰모델인 게시물을 표시합니다. 모든 게시물 표시
레이블이 힐트뷰모델인 게시물을 표시합니다. 모든 게시물 표시
, , , , , , , , ,

안드로이드 힐트(hilt)로 뷰모델 주입하기

안드로이드 힐트(Hilt)로 뷰모델 주입하기

안드로이드 개발

회사에서 신규 프로젝트를 하면서 MVVM 패턴을 사용하고 있다.

MVVM 패턴을 사용할 때 거의 필수인 Hilt를 사용하여 프로젝트를 진행했다.

오늘은 가장 흔히 사용되는 뷰모델(ViewModel)을 주입하는 방법을 소개한다.


먼저, 힐트를 위한 기본 세팅을 해야하는데 이전 글을 참고하길 바란다.

1. ktx dependency 추가하기

dependencies {

//ktx
implementation "androidx.activity:activity-ktx:1.5.0"
implementation "androidx.fragment:fragment-ktx:1.5.0"
}

앱 수준의 gradle 파일에 activity-ktx, fragment-ktx를 추가해준다.

뷰모델 주입을 간편하게 해준다.


2. @AndroidEntryPoint 주석 달기

@AndroidEntryPoint
class MainActivity : BaseActivity<ActivityMainBinding>(){}

뷰모델을 주입할 액티비티나 프래그먼트에 @AndroidEntryPoint 주석을 단다.

이 컴포넌트에 힐트를 이용하여 객체를 주입할 것이다 라는 신호이다.


3. Hilt에 뷰모델을 주입하는 방법 알려주기

@HiltViewModel
class MainViewModel @Inject constructor(
application: Application,
val preferenceRepository: PreferenceRepository
) : BaseViewModel(application) {

Hilt가 객체를 주입하려면 그 객체를 어떻게 생성해야하는지 알아야한다.

Hilt는 이것을 생성자 주입을 통해 객체의 생성 방식을 알게된다.

일단, 우리는 뷰모델을 주입할 것이기 때문에 ViewModel 클래스 위에 @HiltViewModel 어노테이션을 달아준다.

그리고 constructor 앞에 @Inject 어노테이션을 적어주면서 힐트에게 이 객체를 만들 때 필요한 객체를 주입한다.

(동시에 힐트에 뷰모델을 만들 때 이러한 객체들이 필요하다는 것을 알려주게 된다.)

가끔, 다른 블로그보면 @ViewModelInject 어노테이션을 쓰는 경우가 보이는데 이것은 이제 deprecated 되었다!

👉참고로 Hilt에서는 기본적으로 제공하는 객체들이 있다.

위의 코드에서는 application이 그 예이다.

따로 어노테이션을 달아주지 않아도 Hilt는 application 객체를 알아서 주입해준다.

이와 같은 객체에는 ActivityContext가 있다.


4. 액티비티에 뷰모델 변수 선언하기


@AndroidEntryPoint
class MainActivity : BaseActivity<ActivityMainBinding>(){

private val mainViewModel: MainViewModel by viewModels()

}
액티비티에 뷰모델을 선언해주면된다.

이때, activity-ktx에서 제공하는 by viewModels() 를 사용하면 위임을 통해 뷰모델을 쉽게 주입할 수 있다.

주의할 점은 @Inject 어노테이션이 필요없다!

                                                                     
 

이번에는 프래그먼트에서 액티비티 뷰모델을 참조하는 방식을 알아보자.

너무 간단하다. 쫄지말자 ㅋ


@AndroidEntryPoint
class MeasureFragment : BaseFragment<FragmentMeasureBinding>(), OnMapReadyCallback {
override val layoutResID: Int
get() = R.layout.fragment_measure

@Inject
lateinit var preferenceRepository: PreferenceRepository

private val measureViewModel: MeasureViewModel by viewModels()
private val mainViewModel: MainViewModel by activityViewModels() }

우선, Fragment 클래스 위에 @AndroidEntryPoint를 적어준다.

그리고 액티비티에서 주입한 뷰모델을 선언해준다.

이때는 by viewModels()가 아니라 by activityViewModels()를 통해 뷰모델을 선언해주면 된다.

이제 액티비티에서 사용하는(액티비티 컴포넌트에서 선언된) 뷰모델을 공유해서 사용할 수 있다.

이렇게하면 데이터를 액티비티와 프래그먼트가 손쉽게 공유해서 앱을 만들 수 있다.

 


Share:
Read More