Skip to content

Instantly share code, notes, and snippets.

@thegarlynch
Created March 19, 2020 13:17
Show Gist options
  • Save thegarlynch/45cfa7c93b04b790f10027651e4a1021 to your computer and use it in GitHub Desktop.
Save thegarlynch/45cfa7c93b04b790f10027651e4a1021 to your computer and use it in GitHub Desktop.
configurasi_viewmodel
@file:Suppress("UNCHECKED_CAST")
package com.thegar.helper
import android.os.Bundle
import androidx.activity.viewModels
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
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
inline fun <reified T : ViewModel> FragmentActivity.viewModel(
crossinline provider: () -> T) = viewModels<T> {
object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T = provider() as T
}
}
inline fun <reified T : ViewModel> Fragment.viewModel(
crossinline provider: () -> T) = viewModels<T> {
object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T = provider() as T
}
}
inline fun <reified T : ViewModel> Fragment.activityViewModel(
crossinline provider: () -> T) = activityViewModels<T> {
object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T = provider() as T
}
}
inline fun <reified T : ViewModel> FragmentActivity.viewModelWithSavedState(
crossinline provider: () -> SavedStateHandleFactory<T>
) = viewModels<T> {
object : AbstractSavedStateViewModelFactory(this, null){
override fun <T : ViewModel?> create(
key: String,
modelClass: Class<T>,
handle: SavedStateHandle
) = provider().create(handle) as T
}
}
inline fun <reified T : ViewModel> Fragment.viewModelWithSavedState(
crossinline provider: () -> SavedStateHandleFactory<T>
) = viewModels<T> {
object : AbstractSavedStateViewModelFactory(this, null){
override fun <T : ViewModel?> create(
key: String,
modelClass: Class<T>,
handle: SavedStateHandle
) = provider().create(handle) as T
}
}
inline fun <reified T : ViewModel> Fragment.activityViewModelWithSavedState(
crossinline provider: () -> SavedStateHandleFactory<T>
) = activityViewModels<T>{
object : AbstractSavedStateViewModelFactory(activity!!, null){
override fun <T : ViewModel?> create(
key: String,
modelClass: Class<T>,
handle: SavedStateHandle
) = provider().create(handle) as T
}
}
interface SavedStateHandleFactory<T : ViewModel> {
fun create(handle: SavedStateHandle) : T
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment