ViewModel 초기화 방법

pnlkc·2022년 6월 2일
1
post-thumbnail
post-custom-banner

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의 myViewModelthis인 MainActivityLifecycle을 따르게 된다.

  • 프래그먼트에서 초기화하기

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의 myViewModelthis인 MainFragmentLifecycle을 따르게 된다.

만약 액티비티와 프래그먼트의 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()를 추가해주면 된다.

profile
안드로이드 개발 공부 블로그
post-custom-banner

0개의 댓글