Skip to content

Instantly share code, notes, and snippets.

@GabrielBrasileiro
Created June 3, 2020 14:34
Show Gist options
  • Save GabrielBrasileiro/81fefe0e582f1d3456e3b7e14dd18f94 to your computer and use it in GitHub Desktop.
Save GabrielBrasileiro/81fefe0e582f1d3456e3b7e14dd18f94 to your computer and use it in GitHub Desktop.
Get the ViewModel instance with a simple way
class SampleActivity : AppCompatActivity(R.layout.activity_sample) {
private val viewModel by getViewModel { SampleViewModel(SingleLiveEvent()) }
...
}
class SampleFragment : Fragment(R.layout.fragment_sample) {
private val viewModel by getViewModel { SampleViewModel(SingleLiveEvent()) }
...
}
/**
* Get [ViewModel] definition
*/
inline fun <reified VM : ViewModel> ViewModelStoreOwner.getViewModel(
crossinline viewModelScope: () -> VM
): Lazy<VM> {
return lazy { ViewModelProvider(this, getFactory(viewModelScope)).get(VM::class.java) }
}
/**
* Create [ViewModel] factory
*/
@Suppress("UNCHECKED_CAST")
inline fun <VM : ViewModel> getFactory(
crossinline viewModelScope: () -> VM
): ViewModelProvider.Factory = object : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return viewModelScope.invoke() as T
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment