我如何创建共同的viewmodelfactory与库在kotlin android?



我想在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() 

相关内容

  • 没有找到相关文章

最新更新