【问题标题】:Cannot create an instance of class - ViewModel无法创建类的实例 - ViewModel
【发布时间】:2018-06-21 12:50:35
【问题描述】:

我正在关注 google 的示例,该示例在 java 中,但是当我在 kotlin 中重写它时,我无法实例化该类。 我正在学习视图模型。我很怀疑我是否弄乱了我的 kotlin 代码的语法。

https://github.com/googlecodelabs/android-room-with-a-view

类 MainActivity: AppCompatActivity() {

//    private lateinit var mWordViewModel: WordViewModel //not works
    private var mWordViewModel: WordViewModel? = null //not works
    private var wordListAdapter: WordListAdapter?= null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        try {
            mWordViewModel = ViewModelProviders.of(this@MainActivity).get(WordViewModel::class.java)
        }catch (e: Exception){
            e.printStackTrace()
        }

...

class WordViewModel(application: Application): AndroidViewModel(application) {

//    super(application)

    private var mRepository: WordRepository? = null
    private var mAllWords: LiveData<List<Word>>? = null

    init {
        mRepository = WordRepository(application)
        mAllWords = mRepository?.getAllWords()
    }

...

class WordRepository(application: Application) {

    private var mWordDao: WordDao? = null
    private var mAllWords: LiveData<List<Word>>? = null

    init {
        val db = WordRoomDatabase.getDatabase(application)
        mWordDao = db.wordDao()
        mAllWords = mWordDao!!.getAlphabetizeWords()
    }

...

@Database(entities = arrayOf(Word::class), version = 1)
abstract class WordRoomDatabase: RoomDatabase(){

    abstract fun wordDao(): WordDao

    companion object {
        @JvmStatic
        private var INSTANCE: WordRoomDatabase? = null

        fun getDatabase(context: Context): WordRoomDatabase {
            if (INSTANCE == null) {
                synchronized(WordRoomDatabase::class.java) {
                    if (INSTANCE == null) {
                        INSTANCE = Room.databaseBuilder(context.applicationContext, WordRoomDatabase::class.java, "word_database")
                                .fallbackToDestructiveMigration()
                                .addCallback(sRoomDatabaseCallback)
                                .build()
                    }
                }
            }
            return INSTANCE!!
        }

【问题讨论】:

  • 你能提供完整的堆栈跟踪吗?
  • 进程:com.example.felippe.livedata,PID:11852 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.felippe.livedata/com.example.felippe. livedata.MainActivity}: kotlin.KotlinNullPointerException @ElectroWeak
  • 这只是堆栈跟踪的开始。复制整个文本。

标签: android kotlin viewmodel android-architecture-components


【解决方案1】:

@zunjae

错误

1 - 语法代码 koltin.

2 - 项目配置。

class MainActivity: AppCompatActivity() {
mWordViewModel = ViewModelProviders.of(this@MainActivity).get(WordViewModel(application)::class.java)

...

class WordViewModel constructor (application: Application):  AndroidViewModel(application){

...

class WordRepository constructor(application: Application) {

...

添加应用 build.gradle

apply plugin: 'kotlin-kapt'

kapt "android.arch.lifecycle:extensions:$rootProject.archLifecycleVersion"
kapt "android.arch.persistence.room:compiler:$rootProject.roomVersion"

【讨论】:

    【解决方案2】:

    我有同样的问题,但在 JAVA 中。使用 ViewModelFactory 解决了我的问题,如下所示:

    public class MyViewModelFactory implements ViewModelProvider.Factory {
        private Application mApplication;
    
    
    
        public MyViewModelFactory(Application application) {
            mApplication = application;
    
        }
        @Override
        public <T extends ViewModel> T create(Class<T> modelClass) {
            return (T) new BookViewModel(mApplication);
        }
    

    在调用 ViewModel 的地方,将其更改为:

    mBookViewModel = new ViewModelProvider(this, new MyViewModelFactory
                    (this.getApplication())).get(BookViewModel.class);
    

    您可以从教程的 Github 问题页面查看此问题的链接: https://github.com/googlecodelabs/android-room-with-a-view/issues

    【讨论】:

    • 知道如何解决,以防我们使用片段而不是活动?
    猜你喜欢
    • 2021-11-28
    • 2017-12-13
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多