androidkotlinandroid-viewmodelandroid-jetpack-compose

Jetpack Compose pass parameter to viewModel


How can we pass parameter to viewModel in Jetpack Compose?

This is my composable

    @Composable
    fun UsersList() {
      val myViewModel: MyViewModel = viewModel("db2name") // pass param like this
    }

This is viewModel

    class MyViewModel(private val dbname) : ViewModel() {
        private val users: MutableLiveData<List<User>> by lazy {
            MutableLiveData<List<User>>().also {
                loadUsers()
            }
        }
    
        fun getUsers(): LiveData<List<User>> {
            return users
        }
    
        private fun loadUsers() {
            // Do an asynchronous operation to fetch users.
        }
    }

Solution

  • you need to create a factory to pass dynamic parameter to ViewModel like this:

    class MyViewModelFactory(private val dbname: String) :
        ViewModelProvider.NewInstanceFactory() {
        override fun <T : ViewModel?> create(modelClass: Class<T>): T = MyViewModel(dbname) as T
    }
    

    then use your factory like this in composable functions:

    @Composable
    fun UsersList() {
        val myViewModel: MyViewModel =
            viewModel(factory = MyViewModelFactory("db2name")) // pass param like this
    }
    

    and now you have access to dbname parameter in your ViewModel:

    class MyViewModel(private val dbname:String) : ViewModel() {
        // ...rest of the viewModel logics here
    }