androidandroid-viewmodelandroid-savedstate

How do I use the new Saved State Module of ViewModel


I'm using lifecycle version 2.2.0-rc03 and the official docs and articles found don't even list the correct class name or constructor arguments. I think I have to get the ViewModel instance through something like this

viewModel = ViewModelProvider(this, SavedStateViewModelFactory(requireActivity().application, savedStateRegistryOwner))
            .get(SelectedTracksViewModel::class.java)

but I can't figure out the SavedStateRegistryOwner.

Can someone give a simple example of how to create the saved state ViewModel instance and the correct way to save and restore a value in the ViewModel?


Solution

  • For using Saved State module for View Model you have to add the androidx.lifecycle:lifecycle-viewmodel-savedstate dependency to your project. This example has been written based on version 1.0.0-rc03.

    Please add the following line to your project Gradle file:
    implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-rc03'

    ViewModel implementation:

    class SavedStateViewModel(private val state: SavedStateHandle) : ViewModel() {
    
        val liveData = state.getLiveData("liveData", Random.nextInt().toString())
    
        fun saveState() {
            state.set("liveData", liveData.value)
        }
    }
    

    Activity implementation:

    class SavedStateActivity : AppCompatActivity() {
    
        lateinit var viewModel: SavedStateViewModel;
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val binding: ActivityStateBinding = DataBindingUtil.setContentView(this, R.layout.activity_state)
    
            viewModel = ViewModelProvider(this, SavedStateViewModelFactory(this.application, this)).get(SavedStateViewModel::class.java)
    
            binding.viewModel = viewModel
            binding.lifecycleOwner = this
        }
    
        override fun onSaveInstanceState(outState: Bundle) {
            if(::viewModel.isInitialized)
                viewModel.saveState()
    
            super.onSaveInstanceState(outState)
        }
    }
    

    I have tested this code and it works fine.