问题
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).
回答1:
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:
- Assuming your view model is something similar to this:
class SavedStateViewModel(val handle: SavedStateHandle, val service: SimpleService)
- ...and your DI looks like this:
viewModel { (handle: SavedStateHandle) -> SavedStateViewModel(handle, get()) }
- Your shared state view model can be consumed in your fragments like this:
val sharedSaved: SavedStateViewModel by sharedViewModel()
- (important!) You need this declaration in your activity:
lateinit var savedVm: SavedStateViewModel
- (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).
来源:https://stackoverflow.com/questions/61310373/koin-sharedviewmodel-with-savedstatehandle