Single live events in multiple fragments with Shared ViewModel

Viewed 993

I have a shared viewmodel in multiple fragments.

class MainFragment {
      private val sharedViewModel: HomeActivityViewModel by activityViewModels()
}

class MagazinesFragment {
      private val sharedViewModel: HomeActivityViewModel by activityViewModels()
}

And I have an event within that shared view model.

class HomeActivityViewModel{
       val userAuthStatusChanges = MutableLiveData<Boolean>()
}

And I am observing that event in multiple fragments.

 class MainFragment {
       //...
          sharedViewModel.userAuthStatusChanges.observe(viewLifecycleOwner) {
            // do smth
        }
    }
    
 class MagazinesFragment {
         //...
          sharedViewModel.userAuthStatusChanges.observe(viewLifecycleOwner) {
            // do smth
        }
    }

Whenever that userAuthStatusChanges event happens, I want to fire single live event in all fragments that are observing that event.

If I make the event MutableLiveData, the event gets observed whenever fragment is recreated. If I use SingleLiveEvent, the event gets observed only one time and only in one fragment.

I want this event triggered in all fragments and only one time in each fragment. I am using navigation component.

1 Answers

You can do like this ,

private val _userAuthStatusChanges = MutableLiveData<Boolean>()
val userAuthStatusChanges: LiveData<Boolean> = _userAuthStatusChanges

fun changeStatus(value: Boolean) {
    _userAuthStatusChanges.postValue(value)
}

Observe the Live Data and whenever you want to change the value, call the changeValue() function.

If you want to give some initial value you can add init block.

Like this ,

init {
    _userAuthStatusChanges.postValue(false)
}
Related