Home > Back-end >  Viewmodel seems to be scoped to a fragment instead of activity. I am using navigation component as w
Viewmodel seems to be scoped to a fragment instead of activity. I am using navigation component as w

Time:12-22

I am using navigation component and I have one activity in the app with so many fragments. I am trying to use one view model scoped to the activity in all the fragments but it working only in the 3 fragments nested in my home fragment. The home fragment which is the navigation host fragment is using a view pager to add 3 tabs which are 3 fragments within the home fragment. For instance I have like 3 tabs A, B, C. Between these three I can share data in view model successfully. 'A' has a detail fragment lets call it D. when I try to access shared viewModel in D it has null values which I know I have set already in A. I have a normal view model class. in each fragment I instantiate view model like this

private val viewModel: MainActivityViewModel by activityViewModels()

it seems the viewModel is only scoped to the home fragment because it not working inside any detail fragment that I navigate to. Thank you. !

just in case there is something unusual about my view model class here is how it looks like

class MainActivityViewModel: ViewModel() {
   var itemListLiveData = MutableLiveData<List<Item>>()

   fun setItems(itemList: List<Item>)  {
       itemListLiveData.value = itemList
   }
   fun getItems() = itemListLiveData.value
}

CodePudding user response:

You have to initialise your viewModel in onCreate method of your fragment.

// declare your viewModel like this
lateinit var viewModel : MainActivityViewModel

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // other code

    // initialise your view model here
    viewModel = ViewModelProvider(requireActivity()).get(MainActivityViewModel::class.java)

    // other code

}

Also there is one mistake in your MainActivityViewModel class:

fun setItems(itemList: List<Item>)  {
   // set your live data like this
   itemListLiveData.postValue(itemList)
}

CodePudding user response:

Try instantiating your viewmodel like this

lateinit var viewModel: MainActivityViewModel

and in onViewCreated

viewModel = (activity as MainActivity).viewModel

This worked for me in the past when sharing a ViewModel.

  • Related