首页 > 解决方案 > jetpack compose 将参数传递给 viewModel

问题描述

我们如何在jetpack compose中将参数传递给viewModel?

这是我的可组合

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

这是视图模型

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.
    }
}

标签: androidkotlinandroid-viewmodelandroid-jetpack-compose

解决方案


您需要创建一个工厂来将动态参数传递给 ViewModel,如下所示:

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

然后在可组合函数中使用你的工厂:

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

现在您可以访问 ViewModel 中的 dbname 参数:

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

推荐阅读