Skip to content

Instantly share code, notes, and snippets.

@mlykotom
mlykotom / Motivation_SomeViewModel.kt
Last active January 3, 2020 09:18
Connecting The Dots :: Motivation - manually added dependencies
class SomeViewModel(
private val dep1: Dependency,
private val dep2: Dependency2,
private val articleId: String
) : ViewModel() {
class Factory constructor(
private val dep1: Dependency,
private val dep2: Dependency2,
private val articleId: String
@mlykotom
mlykotom / Connecting_AssistedSavedStateViewModelFactory.kt
Last active January 3, 2020 09:44
Connecting The Dots :: Assisted Saved State - Abstract Factory
/**
* Base interface for all ViewModel factories
*/
interface AssistedSavedStateViewModelFactory<T : ViewModel> {
fun create(savedStateHandle: SavedStateHandle): T
}
@mlykotom
mlykotom / Connecting_SavedState_ViewModel_Body_Simple.kt
Last active January 3, 2020 09:45
Connecting The Dots :: Pure SavedState - ViewModel body simple
class SomeViewModel(/* ..ommited.. */){
val counter = savedStateHandle.getLiveData("counter", 0)
fun onPlusClick() {
counter.value = (counter.value ?: 0) + 1
}
}
@mlykotom
mlykotom / Connecting_SavedState_ViewModel_Body.kt
Last active January 3, 2020 09:45
Connecting The Dots :: Pure SavedState - ViewModel body
class SomeViewModel(/* ..ommited.. */){
val counter = MutableLiveData<Int>(0)
init {
counter.value = savedStateHandle.get("counter") ?: 0
counter.observeForever { newValue ->
savedStateHandle.set("counter", newValue)
}
}
@mlykotom
mlykotom / Connecting_SavedState_ViewModel_Constructor.kt
Last active January 3, 2020 09:45
Connecting The Dots :: Pure SavedState - ViewModel constructor
class SomeViewModel(
private val application: Application,
private val savedStateHandle: SavedStateHandle
){
// ...
}
@mlykotom
mlykotom / Connecting_SavedState_Fragment.kt
Last active January 3, 2020 09:46
Connecting The Dots :: Pure SavedState - Fragment
class SomeFragment : Fragment() {
lateinit var viewModel : SomeViewModel
override fun onCreate(savedState: Bundle?){
super.onCreate(savedState)
// default arguments, so you can set something dynamically
val defaultArgs: Bundle? = bundleOf("id" to 5) // may be null
// default factory for ViewModel creation
@mlykotom
mlykotom / Connecting_Motivation_AfterInitViewModel.kt
Last active January 3, 2020 09:46
Connecting The Dots :: Motivation - parameters after initialization of ViewModel
class SomeViewModel @Inject constructor(
private val depFromDagger1: Dependency,
private val depFromDagger2: Dependency2
) : ViewModel(){
// may crash with UninitializedPropertyAccessException
lateinit var articleId: String
// must !! or ?. for every access
var fragmentParams: Bundle? = null
@mlykotom
mlykotom / Connecting_Motivation_SomeFragment.kt
Last active January 3, 2020 09:46
Connecting The Dots :: Motivation - manually added dependencies
class SomeFragment : Fragment() {
// inject into this class omitted for brevity
@Inject
lateinit var dep1: Dependency
@Inject
lateinit var dep2: Dependency
lateinit var viewModel : SomeViewModel
@mlykotom
mlykotom / Connecting_SomeViewModel.kt
Last active January 3, 2020 09:47
Connecting the dots :: SomeViewModel.kt
class SomeViewModel @AssistedInject constructor(
private val appContext: Context,
private val someDaggerDependency: SomeDaggerDependency,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
@AssistedInject.Factory
interface Factory : AssistedSavedStateViewModelFactory<SomeViewModel>
}
@mlykotom
mlykotom / Connecting_InjectingSavedStateViewModelFactory.kt
Last active January 3, 2020 09:48
Connecting the dots :: InjectingSavedStateViewModelFactory.kt
@Reusable
class InjectingSavedStateViewModelFactory @Inject constructor(
private val assistedFactories: Map<Class<out ViewModel>, @JvmSuppressWildcards AssistedSavedStateViewModelFactory<out ViewModel>>
) {
fun create(owner: SavedStateRegistryOwner, defaultArgs: Bundle? = null): AbstractSavedStateViewModelFactory {
return object : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(key: String, modelClass: Class<T>, handle: SavedStateHandle): T {
// Attempt to get ViewModel from assisted inject factories