본문 바로가기

ANDROID/Architecture

[안드로이드] activityViewModels를 활용해 Activity와 Fragment끼리 ViewModel 공유하기

 

구글 Material Design Component를 다루는 토이 프로젝트에서 BottomNavigationView를 다루는 Activity가 있었는데,

 

여기에서 각 탭을 선택할 때 보여지는 Fragment 내에 존재하는 버튼을 눌렀을 때, Activity의 뷰에 들어가 있는

 

BottomNavigationView의 뱃지를 업데이트 하고 싶었다.

 

 

이를 구현하기 위해서는 기존에 by viewModels 코틀린 Delegation을 활용해 주입했던 ViewModel을 Activity에 우선 주입하고, 

 

이를 Fragment에서 activityViewModels Delegation으로 주입해주어야 했다.

 

이 코틀린 Delegation을 활용하기 위해서는 아래의 라이브러리가 그래들에 선언되어야 한다.

 

// 20년 6월 28일자 최신 버전
implementation 'androidx.fragment:fragment-ktx:1.2.5'
implementation 'androidx.activity:activity-ktx:1.1.0'


 

1. Activity 영역 : viewModel을 주입하기 위해 만든 InjectorUtils의 function과 이를 활용해 viewModel을 주입한다.

 

...


// InjectorUtils 클래스에서 ViewModel을 주입하기 위한 function
fun provideBottomViewModelOnActivity(activity: AppCompatActivity): BottomNavViewModelFactory{
        val repository = getBottomNavRepository(activity.application.applicationContext)
        return BottomNavViewModelFactory(repository, activity)
    }
    
    ...


// Activity 클래스에 선언된, 공유하고자 하는 viewModel
private myNavViewModel: BottomNavViewModel by viewModels {
        InjectorUtils.provideBottomViewModelOnActivity(this)
    }

 

!! AAC의 ViewModel에 SaveStateRegistryOwner를 넘겨줄 수 있는건 AppCompatActivity임을 주의


2. Fragment 영역 : Activity에 선언해 준 동일한 ViewModel 클래스에 by activityViewModels() delegation을 추가한다.

 

    private val testViewModel: BottomNavViewModel by activityViewModels()

 

간단히 위 설정을 마치고 나면 이제 Activity와 Fragment들 간에 동일한 뷰 모델을 공유하게 된다!

 

 

전체 코드는 아래 Repo에서..

 

 

victory316/MaterialStudy

App build with Google Material Guideline and components - victory316/MaterialStudy

github.com

 

< 참조 >

 

 

ViewModel 개요  |  Android 개발자  |  Android Developers

ViewModel을 사용하면 수명 주기를 인식하는 방식으로 UI 데이터를 관리할 수 있습니다.

developer.android.com