목적


여러 Fragment가 같은 ViewModel을 사용해서, 데이터를 공유하도록 하고 싶었습니다.

방법1. ActivityViewModel


ActivityViewModel을 사용하면 손쉽게 여러 Fragment가 같은 ViewModel을 사용할 수 있습니다. 하지만 ActivityViewModel을 생성한 activity, ActivityViewModel을 생성한 fragment가 속한 activity가 configuration change 외의 이유로 destroy 되기 전까지 살아있기 때문에, 필요하지 않은 상황에서도 ActivityViewModel이 메모리를 차지하고, 의도하지 않은 fragment가 ActivityViewModel에 접근할 수 있습니다.

ActivityViewModel이 필요 없어지면 지울 수는 없을까요? ActivityViewModel을 생성한 ViewModelStoreOwner가 가지고 있는 ViewModelStore의 clear 함수를 호출해서 지울 수는 있지만, 이 함수는 ViewModelStore가 가지고 있는 모든 ViewModel을 지우기 때문에, 지워서는 안 되는 ViewModel도 지워지는 문제가 있었습니다.

viewModelStore.PNG

viewmodel clear.PNG

ActivityViewModel을 더 이상 사용하지 않을 때, ViewModel 내부에 있는 데이터를 초기화하는 방법도 있지만, 사용하지 않는 ViewModel이 메모리에 살아있다는 점이 마음에 들지 않았습니다.

방법2. ParentFragment가 생성한 ViewModel 사용하기


ParentFragment가 생성한 ViewModel을 ChildFragment에서 사용하려고 했습니다. Navigation Component에서는 모든 Fragment의 ParentFragment는 NavHostFragment이기 때문에 ParentFragment를 따르는 ViewModel을 사용할 수 없었습니다.

requireParentFragment.png

방법3. NavGraphViewModel