Skip to content

Instantly share code, notes, and snippets.

@adam-hurwitz
Last active September 4, 2020 19:48
Show Gist options
  • Save adam-hurwitz/3915954558ebfbb8eb0f2e3b73b76bad to your computer and use it in GitHub Desktop.
Save adam-hurwitz/3915954558ebfbb8eb0f2e3b73b76bad to your computer and use it in GitHub Desktop.
Optimizing ViewModel with Lifecycle 2.2.0: Passing Arguments/Parameters with SavedState
class SomeFragment: Fragment() {
// Create VM in activity/fragment with VM factory.
// Don't forget to add "kotlinOptions { jvmTarget = '1.8' }" to "android" build.gradle (:app)
val someViewModel: SomeViewModel by viewModels { SomeViewModelFactory(
savedStateRegistryOwner = this,
defaultArgs = Bundle().apply {
putInt(SOME_INT_KEY, 18)
},
someString = "someString") }
private var someInt: Int = 0
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
someViewModel.saveSomeInt(...)
}
override fun onViewStateRestored(savedInstanceState: Bundle?) {
super.onViewStateRestored(savedInstanceState)
someInt = someViewModel.someInt
}
}
class SomeViewModel(private val state: SavedStateHandle, private val someString: String) : ViewModel() {
// The default value is used from 'defaultArgs' since 'defaultArgs' are saved in the ViewModelFactory.
val someInt = state.get<Int>(SOME_INT_KEY)
init {
//TODO: Use 'defaultString' and 'someString' to init process when VM is created. i.e. Get data request.
}
fun saveSomeInt(someInt: Int) {
state.set(SOME_INT_KEY, position)
}
}
class SomeViewModelFactory(
private val owner: SavedStateRegistryOwner,
private val defaultArgs: Bundle,
private val someString: String) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
override fun <T : ViewModel?> create(key: String, modelClass: Class<T>, state: SavedStateHandle) =
SomeViewModel(state, someString) as T
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment