오늘은 뷰모델을 초기화하는 3가지 방법을 알아보겠습니다!😊
1. ViewModelProvider를 이용한 초기화
val viewModel = ViewModelProvider(this@MainActivity).get(___ViewModel::class.java)
ViewModelProvider의 파라미터로 MainActivity(View)를 전달하고 그로부터 ViewModel Class를 넣어 ViewModel을 get 합니다. 이로부터 생겨난 ViewModel은 MainActivity의 생명주기를 따르는 ViewModel이 됩니다.
2. by viewModels()를 이용한 초기화
val viewModel: __ViewModel by viewModels()
해당 뷰모델이 초기화되는 Activity 혹은 Fragment의 생명주기에 종속됩니다.
3. by activityViewModels()를 이용한 초기화
private val viewModel: __ViewModel by activityViewModels()
fragment에서만 사용 가능한 뷰모델 초기화 방식입니다.
Fragment는 Activity에 종속되어있기 때문에 fragment가 생성한 Activity의 생명주기에 뷰모델을 종식시킵니다.
activity(ViewModelStoreOwner)를 공유하는 Fragment간의 데이터 전달이 가능해집니다.
😮 주의할 점
activityViewModels
를 사용하면 Activity가 살아있는동안 뷰모델이 메모리에 올라가 있습니다.
Fragment A와 Fragment B에서 데이터 전달 목적으로 사용하려고 했지만 Activity의 container는 여러 Fragment를 가지고 있을 수 있습니다.
의도하지 않은 Fragment C와 D에서 접근하여 잘못 사용될 가능성이 있습니다
따라서 Fragment간의 데이터 전달은 activityViewModels
보다는 Bundle
을 사용하여 데이터 전달하는 것이 좋습니다.