ViewModel 초기화?
ViewModel을 액티비티나 프래그먼트에서 사용할 때 ViewModel을 사용하려면 ViewModel을 담은 변수를 초기화 후 사용해야한다.
이때 ViewModel을 초기화하는 방법에 다양하게 있다는 것을 알게 되었다.
또한 초기화 방법에 따라 ViewModel의 Lifecyle이 달라진다
는 것을 알게되었다.
방법1, ViewModelProvider를 이용해 초기화하기
ViewModelProvider
를 이용해 초기화하게 되면 ViewModelProvider에 설정한 ViewModelStoreOwner의 Lifecycle을 따르는 ViewModel
이 된다.
class MainActivity : AppCompatActivity() {
//myViewModel 변수를 lateinit으로 생성
private lateinit var myViewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
... 생략 ...
// 여기서는 this의 Lifecycle을 따르는 ViewModel이 됨
myViewModel = ViewModelProvider(this).get(MyViewModel::class.java)
}
}
위의 예에서 보면 액티비티에서 ViewModel을 초기화 할 때 ViewModelProvider의 ViewModelStoreOwner를 this로 설정하였다. 때문에 MainActivity의 myViewModel
은 this인 MainActivity
의 Lifecycle
을 따르게 된다.
class MainFragment : Fragment() {
private lateinit var myViewModel: MyViewModel
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
... 생략 ...
// this의 Lifecycle을 따르는 ViewModel이 됨
myViewModel = ViewModelProvider(this).get(MyViewModel::class.java)
}
}
위의 예에서 보면 프래그먼트에서 ViewModel을 초기화 할 때 ViewModelProvider의 ViewModelStoreOwner를 this로 설정하였다. 때문에 MainFragment의 myViewModel
은 this인 MainFragment
의 Lifecycle
을 따르게 된다.
만약 액티비티와 프래그먼트의 ViewModel을 공유
하고 싶다면 프래그먼트에서 ViewModelProvider의 ViewModelStoreOwner를 requireActivity()
로 설정하면 ViewModel이 프래그먼트를 포함하고 있는 액티비티의 Lifecycle을 따르게 된다.
방법2, by viewModels()를 이용해 초기화 하기
by viewModels()
를 이용해 초기화 할 경우 ViewModel이 초기화 되는 액티비티나 프래그먼트의 Lifecycle
을 따르는 ViewModel이 된다.
class MainActivity : AppCompatActivity() {
private val myViewModel: MyViewModel by viewModels()
... 생략 ...
}
액티비티와 프래그먼트 모두 최상단에 ViewModel 변수를 선언하고 by viewModels()
를 추가해주면 된다.
방법3, by activityViewModels()를 이용해 초기화 하기
by activityViewModels()
를 사용한 초기화는 프래그먼트에서만 사용할 수 있다.
이렇게 초기화 된 ViewModel의 경우 프래그먼트를 포함한 액티비티의 Lifecycle
을 따르는 ViewModel이 된다.
따라서 이 방법을 사용하면 같은 액티비티에 포함된 프래그먼트 사이에 공유된 ViewModel로 사용가능하다.
class MainFragment : Fragment() {
private val myViewModel: MyViewModel by activityViewModels()
... 생략 ...
}
프래그먼트 최상단에 ViewModel 변수를 선언하고 by activityViewModels()
를 추가해주면 된다.