android - 在 android kotlin mvvm 中没有主构造函数就不可能进行超类型初始化
问题描述
我正在尝试做的事情:
我正在尝试将 viewModel 链接到活动并在两者之间使用工厂
在MainActivity.kt
KtMainActivityViewModelFactory ktMainActivityViewModel = ViewModelProviders.of(this,ktMainActivityViewModelFactory).get(KtMainActivityViewModel::class.java)
KtMainActivityViewModelFactory.kt
class KtMainActivityViewModelFactory : ViewModelProvider.Factory {
private val movieRepository: MovieRepository
private val database: MoviesAppDatabase
private val dataservice: MovieDataService
@Inject
constructor(movieRepository: MovieRepository, database: MoviesAppDatabase, dataservice: MovieDataService) {
this.movieRepository = movieRepository
this.database = database
this.dataservice = dataservice
}
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return KtMainActivityViewModelFactory(movieRepository, database, dataservice) as T
}
}
KtMainActivityViewModel.kt
class KtMainActivityViewModel : ViewModel() {
private val movieRepository: MovieRepository
private val database: MoviesAppDatabase
private val dataservice: MovieDataService
constructor(movieRepository: MovieRepository, database: MoviesAppDatabase, dataservice: MovieDataService) : super() {
this.movieRepository = movieRepository
this.database = database
this.dataservice = dataservice
}
}
解决方案
由于您只有一个构造函数,因此应将其设为主要构造函数:
class KtMainActivityViewModel(private val movieRepository: MovieRepository, private val database: MoviesAppDatabase, private val dataservice: MovieDataService) : ViewModel() { ... }
作为额外的好处,这样您还需要提及每个属性一次而不是 4 次。
请注意,您可以在正文中声明private val movieRepository: MovieRepository
等
class KtMainActivityViewModel(movieRepository: MovieRepository, database: MoviesAppDatabase, dataservice: MovieDataService) : ViewModel() {
private val _movieRepository: MovieRepository = movieRepository
...
}
但没有理由这样做。
当然这也适用于KtMainActivityViewModelFactory
:
class KtMainActivityViewModelFactory @Inject constructor(private val movieRepository: MovieRepository, private val database: MoviesAppDatabase, private val dataservice: MovieDataService) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return KtMainActivityViewModelFactory(movieRepository, database, dataservice) as T
}
}
推荐阅读
- xpath - 如何在 IIB 的图形映射节点的自定义 XPath 中创建 if else 函数?
- c++ - 是否可以设置在条件有效的任何地方评估的“全局”条件断点?
- ubuntu - 如何在 Ubuntu 16.04.6 中设置允许 Grafana 绑定到端口 80?
- r - 将 Plotly 预测图转换为 ggplot 图
- javascript - 使用反应动画多个文本
- c# - 如何在以下场景中使用 Autofac 实现装饰器模式
- php - 在 WooCommerce 存档页面上悬停时切换产品图像
- javascript - 如何在 jQuery 中从 responseJSON 中检索数据?
- django - 通道:为什么在处理结束时发送消息
- node.js - AWS 无法签署 CloudFront url PEM 错误