목표
- ViewModel의 초기화 방법을 숙지한다.
ViewModelProvider을 이용한 초기화
class MainActivity : AppCompatActivity(), View.OnClickListener {
val viewModel = ViewModelProvider(this@MainActivity).get(MainViewModel::class.java)
..
}
ViewModelProvider의 파라미터로 MainActivity(View)를 전달하고 그로부터 ViewModel Class를 넣어 ViewModel을 get 한다. 이로부터 생겨난 ViewModel은 MainActivity의 Lifecycle을 따르는 ViewModel이 된다.
by viewModels()를 이용한 초기화
코틀린의 위임(by)을 활용한 by viewModels()를 이용해 초기화를 하기 위해서는 모듈 수준의 build.gradle에 다음의 세팅이 필요하다.
dependencies {
implementation 'androidx.activity:activity-ktx:1.2.2'
implementation 'androidx.fragment:fragment-ktx:1.3.3'
..
}
위의 세팅이 완료되면, Activity와 Fragment에 대한 viewModels 확장함수(ComponentActivity.viewModels(), Fragment.viewModels())를 이용해 viewModel을 생성할 수 있다.
val viewModel: MainViewModel by viewModels()
by viewModels()를 이용한 초기화는 해당 viewModel이 초기화되는 Activity 혹은 Fragment의 Lifecycle에 종속된다.
*by 키워드를 모른다면 다음 글을 참조하자.
by activityViewModels()를 이용한 초기화
by activityViewModels()는 Fragment에서만 사용 가능한 viewModel 초기화 방식이다. Fragment는 Activity에 종속되어 있기 때문에 Fragment가 생성된 Activity의 Lifecycle에 ViewModel을 종속시킨다.
inline fun <reified VM : ViewModel> Fragment.activityViewModels
Fragment에 대한 확장 함수로만 짜여 있으며, Activity에서는 사용할 수 없다.
private val viewModel: SearchChampionViewModel by activityViewModels()
이를 이용해 같은 Activity(ViewModelStoreOwner)를 공유하는 Fragment 간의 데이터 전달이 가능해지는데 다음 글에서 해당 내용에 대해 다루도록 하겠다.