Skip to content

Instantly share code, notes, and snippets.

@thecodeside
Created February 20, 2022 18:05
Show Gist options
  • Save thecodeside/b61563b262c6fb75b8b78a98089448ed to your computer and use it in GitHub Desktop.
Save thecodeside/b61563b262c6fb75b8b78a98089448ed to your computer and use it in GitHub Desktop.
internal fun <VM : ViewModel> viewModelFactory(
create: () -> VM
): ViewModelProvider.Factory {
return object : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <VM : ViewModel> create(modelClass: Class<VM>): VM = create() as VM
}
}
internal fun <VM : ViewModel> Fragment.savedStateViewModelFactory(
create: (savedStateHandle: SavedStateHandle) -> VM
): ViewModelProvider.Factory {
return object : AbstractSavedStateViewModelFactory(this, arguments) {
@Suppress("UNCHECKED_CAST")
override fun <VM : ViewModel?> create(
key: String, modelClass: Class<VM>,
handle: SavedStateHandle
): VM {
return create(handle) as VM
}
}
}
// It will work with the default ViewModel delegates:
private val viewModel: FancyViewModel by viewModels {
viewModelFactory {
FancyViewModel()
}
}
private val savedStateViewModel: FancySavedStateViewModel by viewModels {
savedStateViewModelFactory { savedState ->
FancySavedStateViewModel(savedState)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment