一、前言
通常使用ViewModel的时候类似于以下方式
private val viewModel: BusScheduleViewModel by viewModels()
但是这种方式生成ViewModel的话,没有办法在构造函数中传递参数。所以需要使用到ViewModelProvider.Factory。
二、示例
所以这里演示下如何使用
首先定义一个UserViewModel.kt
class UserViewModel(userType: String): ViewModel() {
}
其次定义一个工厂类UserViewModelFactory.kt
class UserViewModelFactory(
private val type: String
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(UserViewModel::class.java)) {
@Suppress("UNCHECKED_CAST")
return UserViewModel(type) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
使用方式如下:
private val viewModel: UserViewModel by viewModels {
UserViewModelFactory(
"0"
)
}
不过上述的话需要每一个ViewModel都要写一个Factory,可以使用反射来简化一下
class UserViewModelFactory(
private val type: String
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return modelClass.getConstructor(String::class.java).newInstance(type)
}
}
三、参考链接
-
ViewModel 和 ViewModelProvider.Factory:ViewModel 的创建者
-
androidRoom 和 Flow 简介
本文介绍如何在Android开发中为ViewModel传递参数,并通过自定义ViewModelProvider.Factory实现这一过程。演示了使用Kotlin定义带参数的ViewModel及相应的工厂类,同时提供了一种使用反射简化Factory的方法。

993

被折叠的 条评论
为什么被折叠?



