Android LiveData - how to reuse the same ViewModel on different activities?

后端 未结 3 1623
情歌与酒
情歌与酒 2020-12-14 15:13

Example ViewModel:

public class NameViewModel extends ViewModel {
    // Create a LiveData with a String
    private MutableLiveData mCurrentNa         


        
3条回答
  •  北荒
    北荒 (楼主)
    2020-12-14 15:43

    Simply create the instance of your ViewModel, in this case NameViewModel

    Your ViewModel Factory be like

    class ViewModelFactory : ViewModelProvider.NewInstanceFactory() {
    
        override fun  create(modelClass: Class) =
            with(modelClass){
                when {
                    isAssignableFrom(NameViewModel::class.java) -> NameViewModel.getInstance()
                    else -> throw IllegalArgumentException("Unknown viewModel class $modelClass")
                }
            } as T
    
    
        companion object {
            private var instance : ViewModelFactory? = null
            fun getInstance() =
                instance ?: synchronized(ViewModelFactory::class.java){
                    instance ?: ViewModelFactory().also { instance = it }
                }
        }
    }
    

    And your ViewModel

    class NameViewModel : ViewModel() {
    
        //your liveData objects and many more...
    
        companion object {
            private var instance : NameViewModel? = null
            fun getInstance() =
                instance ?: synchronized(NameViewModel::class.java){
                    instance ?: NameViewModel().also { instance = it }
                }
        }
    }
    

    Now you can use ViewModelProviders to get the same instance of your ViewModel to use in any activity

    ViewModelProviders.of(this, ViewModelFactory.getInstance()).get(NameViewModel::class.java)
    

    OR

    create an extension function for easier access

    fun  AppCompatActivity.getViewModel(viewModelClass: Class) =
        ViewModelProviders.of(this, ViewModelFactory.getInstance()).get(viewModelClass)
    

提交回复
热议问题