Skip to content

Instantly share code, notes, and snippets.

@andretietz
Created January 22, 2020 17:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andretietz/20a9e60d99cc863cb1411edb1dd17261 to your computer and use it in GitHub Desktop.
Save andretietz/20a9e60d99cc863cb1411edb1dd17261 to your computer and use it in GitHub Desktop.
package androidx.lifecycle
import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.savedstate.SavedStateRegistryOwner
object ViewModelHelper {
/**
* [androidx.lifecycle.ViewModelProvider.DEFAULT_KEY]
**/
private const val DEFAULT_KEY = "androidx.lifecycle.ViewModelProvider.DefaultKey"
private fun getProvider(
activity: FragmentActivity,
viewmodelFactory: ViewModelProvider.Factory
) = ViewModelProviders.of(activity, viewmodelFactory)
private fun getProvider(
activity: Fragment,
viewmodelFactory: ViewModelProvider.Factory
) = ViewModelProviders.of(activity, viewmodelFactory)
private fun <VIEWMODEL : ViewModel> getHandle(
provider: ViewModelProvider,
owner: SavedStateRegistryOwner,
type: Class<VIEWMODEL>,
defaultBundle: Bundle? = null
) = requireNotNull(provider.get(type)).also {
if (it is SavedStateViewModel) {
it.savedStateHandle = SavedStateHandleController.create(
owner.savedStateRegistry,
owner.lifecycle,
"${DEFAULT_KEY}:${type.canonicalName}",
defaultBundle
).handle
}
}
fun <VIEWMODEL : ViewModel> getViewModel(
activity: FragmentActivity,
viewmodelFactory: ViewModelProvider.Factory,
type: Class<VIEWMODEL>,
defaultBundle: Bundle? = null
): VIEWMODEL = getHandle(getProvider(activity, viewmodelFactory), activity, type, defaultBundle)
fun <VIEWMODEL : ViewModel> getViewModel(
fragment: Fragment,
viewmodelFactory: ViewModelProvider.Factory,
type: Class<VIEWMODEL>,
defaultBundle: Bundle? = null
): VIEWMODEL = getHandle(getProvider(fragment, viewmodelFactory), fragment, type, defaultBundle)
}
abstract class SavedStateViewModel : ViewModel() {
lateinit var savedStateHandle: SavedStateHandle
internal set
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment