Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android kotlin mvvm中,如果没有主构造函数,超级类型初始化是不可能的_Android_Kotlin_Mvvm - Fatal编程技术网

在android kotlin mvvm中,如果没有主构造函数,超级类型初始化是不可能的

在android kotlin mvvm中,如果没有主构造函数,超级类型初始化是不可能的,android,kotlin,mvvm,Android,Kotlin,Mvvm,我想做什么: 我试图将viewModel链接到活动中,并在两者之间使用工厂 在MainActivity.kt中 KtMainActivityViewModelFactory ktMainActivityViewModel = ViewModelProviders.of(this,ktMainActivityViewModelFactory).get(KtMainActivityViewModel::class.java) class KtMainActivityViewModelFact

我想做什么:

我试图将viewModel链接到活动中,并在两者之间使用工厂

MainActivity.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
    }


}
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他只要求消除该错误,并纠正了该错误