我想在kotlin android中为多个视图模型创建单个viewmodelfactory。我该怎么做呢?
class AppViewModelFactory : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(LoginViewModel::class.java)) {
return LoginViewModel(
loginRepository = LoginRepository(
dataSource = LoginDataSource()
)
) as T
}
if (modelClass.isAssignableFrom(UserViewModel::class.java)) {
return UserViewModel(
userRepository = UserRepository(
dataSource = UserDataSource()
)
) as T
}
if (modelClass.isAssignableFrom(TransactionViewModel::class.java)) {
return TransactionViewModel(
transactionRepository = TransactionRepository(
dataSource = TransactionDataSource()
)
) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
在上面的代码中,我需要写多个视图模型的名称,如loginviewmodel, userviewmodel和transactionviewmodel。如何减少代码?
您可以使用单一表达式格式缩短它,一个when语句,并且您可能不需要在构造函数中命名属性:
class AppViewModelFactory : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T = when(modelClass){
LoginViewModel::class.java -> LoginViewModel(LoginRepository(LoginDataSource()))
UserViewModel::class.java -> UserViewModel(UserRepository(UserDataSource()))
TransactionViewModel::class.java -> TransactionViewModel(TransactionRepository(TransactionDataSource()))
else -> throw IllegalArgumentException("Unknown ViewModel class")
} as T
}
您可以使用create factory kotlin扩展在运行时创建ViewModel工厂。
<<p>扩展/strong>fun <T : ViewModel> T.createFactory(): ViewModelProvider.Factory {
val viewModel = this
return object : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T = viewModel as T
}
}
如何使用
private lateinit var loginViewModel: LoginViewModel
private fun initLoginViewModel() {
val factory = LoginViewModel(LoginDataSource()).createFactory()
loginViewModel = ViewModelProvider(this, factory).get(LoginViewModel::class.java)
}
您可以尝试使用以下依赖项
implementation 'androidx.fragment:fragment-ktx:1.3.2'
implementation("androidx.activity:activity-ktx:1.3.1")
然后尝试创建视图模型实例
val viewModel:CoinListViewModel by viewModels()