【问题标题】:Super type initialization is impossible without primary constructor in android kotlin mvvm在 android kotlin mvvm 中没有主构造函数就不可能进行超类型初始化
【发布时间】:2019-07-18 10:33:46
【问题描述】:

我想要做什么:

我正在尝试将 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
    }


}

错误:

【问题讨论】:

    标签: android kotlin mvvm


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      尝试将其更改为KtMainActivityViewModel : ViewModel

      【讨论】:

        【解决方案3】:
        class KtMainActivityViewModel : ViewModel() {
        
        
        private lateinit var movieRepository: MovieRepository
        private lateinit var database: MoviesAppDatabase
        private lateinit var dataservice: MovieDataService
        
        
        constructor(movieRepository: MovieRepository, database: MoviesAppDatabase, dataservice: MovieDataService) : super() {
            this.movieRepository = movieRepository
            this.database = database
            this.dataservice = dataservice
            }
         }
        

        您应该添加主构造函数并将super() 替换为this()

        class KtMainActivityViewModel(): ViewModel() {
        

        【讨论】:

        • 这不会编译,因为属性没有初始化。
        • @Alexey Romanov 他只要求摆脱那个错误,也更正了
        猜你喜欢
        • 1970-01-01
        • 2021-07-09
        • 2020-09-15
        • 2015-09-11
        • 2010-10-01
        • 2019-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多