Search code examples
androidandroidxandroid-viewmodelandroid-mvvmkoin

Koin sharedViewModel with SavedStateHandle


I have single activity application and number of fragments. Some of these fragments are using my viewmodel, typically like this:

private val myViewModel: MyViewModel by sharedViewModel()

What if I want to have the model both shared and keep its state with SavedStateHandle? I cannot figure out if this is supported and if so, how it needs to be used (declaring viewmodel as stateViewModel in hosting activity is not working).


Solution

  • Update: as koin 2.1.6 is around, they introduced org.koin.androidx.viewmodel.ext.android.stateSharedViewModel that you can use in your fragments.


    Ok after an hour of digging Koin samples and figuring out a few gotchas:

    1. Assuming your view model is something similar to this:
    class SavedStateViewModel(val handle: SavedStateHandle, val service: SimpleService) 
    
    1. ...and your DI looks like this:
    viewModel { (handle: SavedStateHandle) -> SavedStateViewModel(handle, get()) }
    
    1. Your shared state view model can be consumed in your fragments like this:
    val sharedSaved: SavedStateViewModel by sharedViewModel()
    
    1. (important!) You need this declaration in your activity:
    lateinit var savedVm: SavedStateViewModel
    
    1. (important) You need to call this right after super.onCreate(savedInstanceState) in your activity:
    savedVm  = getStateViewModel() 
    

    It is important not to use lazy version for the above (stateViewModel).