如何在Jetpack Compose
中将参数传递给viewModel
?
这是我的组合
@Composable
fun UsersList() {
val myViewModel: MyViewModel = viewModel("db2name") // pass param like this
}
这是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.
}
}
7条答案
按热度按时间xeufq47z1#
你需要创建一个工厂来传递动态参数给ViewModel,像这样:
然后在可组合函数中像这样使用工厂:
现在您可以访问ViewModel中的dbname参数:
fcg9iug32#
如果你使用导航组件,你可以在
SavedStateHandle
for view模型中免费获得它。将参数传递给调用视图模型的组合对象,并从已保存的状态句柄中检索与视图模型同名的参数。
就像这样:
在NavHost上:
在视图模型上:
您的参数将神奇地出现,而无需视图模型工厂。
cld4siwp3#
其他的解决方案也可以,但是你必须为每个ViewModel创建一个工厂,这似乎有点过分了。
更普遍的解决方案是这样的:
然后像这样使用它:
对于这样的ViewModel:
s2j5cfk04#
通常情况下,你不需要这样做。在Android中,MVVM视图模型通过依赖注入从存储库获取数据。
以下是推荐的Android架构的官方文档:https://developer.android.com/jetpack/guide#recommended-app-arch
y1aodyip5#
下面是一些Jetpack Compose/Kotlin特定的语法,用于实现相同的功能:
然后又道:
kninwzqo6#
没有必要再自己创建
viewModelFactory
。现在它包含在
androidx.lifecycle.viewmodel
中并且可以用作
11dmarpk7#
正如@Secret Keeper提到的,你需要创建工厂。
如果您的ViewModel有依赖项,则viewModel()接受可选的ViewModelProvider.Factory作为参数。
要创建viewModel,您需要传递可选参数。在你的Composable中,你可以做这样的事情。