액티비티 위에 프래그먼트가 띄워져있는 상황에서 뷰모델을 공유할 상황이 생긴다.

기존의 viewmodel을 생성할때

private val searchViewModel: SearchViewModel by viewModels()

이렇게 생성했다. 하지만 이렇게 생성하게 되면 fragment에 종속된다.

다른 fragment와 공유하고 싶다면 viewmodels()대신

private val searchViewModel: SearchViewModel by activityViewModels()

이렇게 설정해햐 한다. 이 경우 프래그먼트들의 부모가 되는 액티비티의 뷰모델을 공유하게 됨으로
한 액티비티에서 파생된 프래그먼트들 끼리는 뷰모델을 공유할수 있고 데이터를 공유하게 된다.

💡 당연히 2개의 프래그먼트에서 1개의 뷰모델을 사용하고자 하는 것이기 때문에 두 프래그먼트에서 선언해야한다!

activityViewModels()의 문제점은 activity가 죽기전까지 viewModel이 계속해서 살아있다는 점이다.

만약 액티비티에 구속되지 않고 프래그먼트들끼리 뷰모델을 공유하고싶다면 다음과 같은 방법이 있다.

private val viewModel: ManageLocationViewModel by viewModels({requireParentFragment()})

viewModels를 선언할 때 requireParentFragment를 기준으로 하는 것이다. 액티비티를 기준으로 잡는것과 비슷하지만 이것은 parentfragment가 죽을때 죽음으로써 액티비티에 비해 좀더 완화되었다고 말할 수 있겠다.

profile
러닝커브를 따라서 등반중입니다.

0개의 댓글