본문 바로가기
Android

Composable 에서 ViewModel 공유하기

by 서퍼리노 2023. 2. 19.
728x90

Android 앱을 개발하다 보면 값들을 공유해야 하는 상황이 있습니다.

하지만 Compose에서 지원해 주는 ViewModel은 Composable 간에 공유가 되지 않습니다.

 

viewModel

@Composable
inline fun <VM : ViewModel> viewModel(
    viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
        "No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
    },
    key: String? = null,
    factory: ViewModelProvider.Factory? = null,
    extras: CreationExtras = if (viewModelStoreOwner is HasDefaultViewModelProviderFactory) {
        viewModelStoreOwner.defaultViewModelCreationExtras
    } else {
        CreationExtras.Empty
    }
): VM

Compose에서 지원해주는 viewModel은 기본적으로

위의 코드와 같이 구현되어있습니다.

 

해당 코드를 확인해 보면

viewModelStoreOwner를 기본 인자로 받고 있는 것을 알 수 있습니다.

 

공식 문서에서 viewModelStoreOwner는

반환된 ViewModel의 범위와 수명을 제어하는 ViewModel의 소유자입니다.
LocalViewModel이 기본값입니다. 

라고 표현이 되어 있습니다.

 

viewModelStoreOwner 범위가 살아있는 동안 ViewModel이 유지됩니다. 

그렇다면 약간의 가설을 더해보자면 현재 composable 함수는
LocalViewModelStoreOwner.current로 인자가 들어가지만 

모두 같은 값들이 들어가지 않아 값이 공유가 되지 않던 것은 아닐까?

그렇다면 각 ViewModel들의 Owner를 Activity로 준다면 공유할 수 있지 않을까?

 

사용해 보기

 viewModel(LocalContext.current as ComponentActivity)

그렇다면 viewModel을 사용할 때 위 코드처럼 viewModelStoreOwner를

Android에서 Context를 가져올 수 있는 현재 context를 가져온다면 같은 Activity안에서는 

사용을 할 수 있지 않을까라고 생각하여 가능하지 않을까라고 생각하여 위처럼 지정해 주었습니다.

 

결과는 성공적으로 값을 공유할 수 있었습니다. 

 

마무리

위와 같은 방법이 아니더라도 viewModel을 먼저 생성해준 후

composable 함수의 인자로 넘겨줄 수 도 있습니다.

 

하지만 실제로 인자로 넘기는 것과 Context를 지정해 주는 것으로 

둘 다 사용해 보았을 때 인자로 viewModel을 넘기다 보면

사용할 수는 있지만,

코드의 규모가 커졌을 경우 코드를 유지 보수하는 데에 많은 것을 변경해야 하는 불편함이 있었습니다.

728x90