본문 바로가기
Android

[Android] Viewmodel stateflow emit 한 값을 collect로 받아왔을 때, 변해있지 않은 이슈

by 박매트 2024. 2. 12.

 

분명... viewmodel에서 emit을 보낼 당시에 값은 바뀌어져있는데,

그 값을 collect로 받아왔을 때, 값이 변하지 않고, 초기값으로 설정되어있었다. 자꾸...

 

각 fragment에서 viewmodel을 접근을 하는데,,, 

가져온는 ownerProducer가 달라서,,, 변한 값을 못가져 왔나보다..

 

GPT 한테 물어봤는데, 

다르면 다르게 가져오냐고 물어봤다...

 

네, 맞습니다. ViewModel의 라이프사이클 스코프가 변경되면 해당 ViewModel의 인스턴스도 해당 스코프에 맞게 존재하게 됩니다. 각각의 스코프에서 다른 인스턴스를 사용하게 됩니다.

예를 들어:

  1. requireActivity()를 사용한 경우:이 경우, 해당 ViewModel은 액티비티의 라이프사이클에 맞게 생성되고 유지됩니다. 따라서 동일한 액티비티 내의 여러 프래그먼트에서 같은 ViewModel 인스턴스를 공유하게 됩니다.
  2. kotlinCopy code
    private val viewModelActivity: HomeViewModel by viewModels(ownerProducer = { requireActivity() })
  3. requireParentFragment()를 사용한 경우:이 경우, ViewModel은 부모 프래그먼트의 라이프사이클에 맞게 생성되고 유지됩니다. 따라서 프래그먼트 계층 구조에서 각 프래그먼트마다 별도의 ViewModel 인스턴스를 갖습니다.
  4. kotlinCopy code
    private val viewModelFragment: HomeViewModel by viewModels(ownerProducer = { requireParentFragment() })

따라서 불러오는 ViewModel의 값이 달라지는 것은 스코프에 맞게 생성된 인스턴스에 의해 결정됩니다. 앱의 아키텍처와 요구 사항에 따라 적절한 스코프를 선택하여 ViewModel을 사용하면 됩니다.

 

아직 Viewmodel에 대해 배우는 중이라 긴가민가하지만,,,

private val viewModel: HomeViewModel by viewModels(ownerProducer = {  requireActivity() })

 

다 동일하게 acitivty 로부터 가져오게 했더니 동일하게 바뀌었다!!!

private val viewModel: HomeViewModel by viewModels(ownerProducer = { requireParentFragment() })

다른 fragment에서는 requreParentFrament()로 불러오고, bottomsheetfragment에서는 requireActivity 로 불러와서,, 다르게 불러와졌나 보다..

 

 

동일하게 읽어오기 성공!!! ^__^