Skip to content

Instantly share code, notes, and snippets.

@davidliu
Created February 16, 2020 20:49
Show Gist options
  • Save davidliu/0cedb6c3d75b86876f83c15fbf6e4830 to your computer and use it in GitHub Desktop.
Save davidliu/0cedb6c3d75b86876f83c15fbf6e4830 to your computer and use it in GitHub Desktop.

Revisions

  1. davidliu created this gist Feb 16, 2020.
    43 changes: 43 additions & 0 deletions FragmentViewModelFactory.kt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,43 @@
    import android.os.Bundle
    import androidx.fragment.app.Fragment
    import androidx.fragment.app.activityViewModels
    import androidx.fragment.app.viewModels
    import androidx.lifecycle.AbstractSavedStateViewModelFactory
    import androidx.lifecycle.SavedStateHandle
    import androidx.lifecycle.ViewModel
    import androidx.lifecycle.ViewModelProvider
    import androidx.savedstate.SavedStateRegistryOwner

    typealias CreateViewModel = (handle: SavedStateHandle) -> ViewModel

    inline fun <reified VM : ViewModel> Fragment.viewModelByFactory(
    defaultArgs: Bundle? = null,
    noinline create: CreateViewModel
    ): Lazy<VM> {
    return viewModels {
    createViewModelFactoryFactory(this, defaultArgs, create)
    }
    }

    inline fun <reified VM : ViewModel> Fragment.activityViewModelByFactory(
    defaultArgs: Bundle? = null,
    noinline create: CreateViewModel
    ): Lazy<VM> {
    return activityViewModels {
    createViewModelFactoryFactory(this, defaultArgs, create)
    }
    }

    fun createViewModelFactoryFactory(
    owner: SavedStateRegistryOwner,
    defaultArgs: Bundle?,
    create: CreateViewModel
    ): ViewModelProvider.Factory {
    return object : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
    override fun <T : ViewModel?> create(key: String, modelClass: Class<T>, handle: SavedStateHandle): T {
    @Suppress("UNCHECKED_CAST")
    return create(handle) as? T
    ?: throw IllegalArgumentException("Unknown viewmodel class!")
    }
    }
    }