在android kotlin mvvm中,如果没有主构造函数,超级类型初始化是不可能的
我想做什么: 我试图将viewModel链接到活动中,并在两者之间使用工厂 在MainActivity.kt中在android kotlin mvvm中,如果没有主构造函数,超级类型初始化是不可能的,android,kotlin,mvvm,Android,Kotlin,Mvvm,我想做什么: 我试图将viewModel链接到活动中,并在两者之间使用工厂 在MainActivity.kt中 KtMainActivityViewModelFactory ktMainActivityViewModel = ViewModelProviders.of(this,ktMainActivityViewModelFactory).get(KtMainActivityViewModel::class.java) class KtMainActivityViewModelFact
KtMainActivityViewModelFactory ktMainActivityViewModel = ViewModelProviders.of(this,ktMainActivityViewModelFactory).get(KtMainActivityViewModel::class.java)
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
}
}
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
}
}
KtMainActivityViewModelFactory.kt
KtMainActivityViewModelFactory ktMainActivityViewModel = ViewModelProviders.of(this,ktMainActivityViewModelFactory).get(KtMainActivityViewModel::class.java)
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
}
}
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
}
}
错误:
您应该添加主构造函数并将super()
替换为this()
尝试将其更改为
KtMainActivityViewModel:ViewModel
,因为您只有一个构造函数,所以应该将其设置为主构造函数:
class KtMainActivityViewModel(private val movieRepository: MovieRepository, private val database: MoviesAppDatabase, private val dataservice: MovieDataService) : ViewModel() { ... }
作为一个额外的好处,这种方式你还需要提到每个属性一次,而不是4次
注意,您可以在body中声明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
}
}
class KtMainActivityViewModelFactory@Inject构造函数(私有val movieRepository:movieRepository,私有val数据库:MOVIESAPPDABASE,私有val数据服务:MOVIEDASERVICE):ViewModelProvider.Factory{
重写趣味创建(modelClass:Class):T{
将KtMainActivityViewModelFactory(移动存储库、数据库、数据服务)返回为T
}
}
这不会编译,因为属性未初始化。@Alexey Romanov他只要求消除该错误,并纠正了该错误