如果没有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
    }


}

错误: 在此处输入图片说明

阿列克谢·罗曼诺夫(Alexey Romanov)

由于您只有一个构造函数,因此应将其设为主要构造函数:

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
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Kotlin:“此类型具有构造函数,因此必须在此处进行初始化”,但未声明任何构造函数

此类型具有构造函数,必须在此处初始化-Kotlin

如果构造函数无法返回null,为什么初始化后需要进行类型检查?

如果没有@Provides注释的方法,则无法提供Kotlin Dagger ViewModel

kotlin + Dagger2:如果没有@Provides注释的方法,则无法提供

kotlin + Dagger 2:如果没有 @Provides 注释的方法,则无法提供 ApiService

如果在Go中构造,则无法初始化struct

Kotlin和构造函数,初始化

没有Dagger2的Android Kotlin MVVM结构

Kotlin:在构造函数中初始化类属性

Kotlin:Interface Queue没有构造函数

没有getter的Kotlin构造函数参数

无法使用Kotlin在Android上初始化Visualizer

在Kotlin中,还有没有更惯用的方式来初始化此地图?

Kotlin中具有延迟初始化和通用工厂方法的类型推断

在没有构造函数的类中初始化变量

从超级类触发的Kotlin初始化块在继承时具有空属性

如何使用Kotlin在android中初始化小部件

Android Kotlin-分类器“活动”没有伴随对象,因此必须在此处初始化

如果没有或只有部分字段在构造函数初始化会发生什么

如果在Kotlin中对其进行了修改,则无法删除可变集中的元素

如果继承了结构,则无法使用初始化程序列表对其进行初始化?

使用私有构造函数进行静态初始化

没有转换器的 Android Room 中 Kotlin 的可空类型?

有没有办法在 Android Kotlin 中以编程方式在视图之间设置边距?

如果失败,Kotlin 对象需要再次初始化

在Kotlin中,如何将主要构造函数中的属性的setter设为私有?

没有@Provides注释的方法无法提供(Android Kotlin中的Dagger 2)

Kotlin 中的 Dagger 2:有没有办法在不使用 Module 的情况下使用默认参数化构造函数对类进行注入?