Android Jetpack/ViewModel

[ViewModel] 3. ViewModel의 다양한 초기화 방법

반응형

목표

  • 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 키워드를 모른다면 다음 글을 참조하자.

 

[Delegate Pattern] 1. Delegate Pattern이란?

목표 Delegate Pattern에 대해 이해한다. Delegate Pattern이란 Delegate란 한국말로 위임이라는 뜻이다. 우리가 계약서 등을 작성할 때 대리인에게 결정 권한을 위임한다고 하면, 대리인은 우리의 결정 권

kotlinworld.com

 

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 간의 데이터 전달이 가능해지는데 다음 글에서 해당 내용에 대해 다루도록 하겠다.

반응형

 

이 글의 저작권은 Kotlin World 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.