无法创建 AndroidViewModel 子类的实例

Mwe*_*ele 2 java android kotlin android-viewmodel

我的 ViewModel 类使用 Java,而我的 Activity 类使用 Kotlin。我收到错误

java:1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) :776) 导致:java.lang.RuntimeException:找不到 com.meme.archcompwordlist.room.WordRoomDatabase 的实现。WordRoomDatabase_Impl 不存在于 android.arch.persistence.room.Room.getGeneratedImplementation(Room.java:93) at android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:630) at com.meme.archcompwordlist .room.WordRoomDatabase.getRoomDatabase(WordRoomDatabase.java:22) 在 com。

这是我的 AndroidViewModel 类

public class WordViewModel extends AndroidViewModel {

    private WordRepository repository;

    private LiveData<List<WordEntity>> allWords;

    public WordViewModel(Application application){
        super(application);
        repository = new WordRepository(application);
        allWords = repository.getAllWords();
    }

    public LiveData<List<WordEntity>> getAllWords(){
        return allWords;
    }

    public void insert(WordEntity word){
        repository.insert(word);
    }

    public void deleteAllWords() {
        repository.deleteAllWords();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的活动课

class MainActivity : AppCompatActivity() {

    private lateinit var wordViewModel:WordViewModel
    private lateinit var newWord:EditText
    private lateinit var recyclerView:RecyclerView
    private lateinit var adapter:WordAdapter


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

        adapter= WordAdapter()
        recyclerView= findViewById<RecyclerView>(R.id.wordList)
        recyclerView.adapter=adapter

        //establish a connection to the current ViewModel
        wordViewModel= ViewModelProviders.of(this).get(WordViewModel::class.java)

        newWord = findViewById<EditText>(R.id.insertWord);
        findViewById<Button>(R.id.submitWord).setOnClickListener {
             fun onClick(v:View?){
                if(!TextUtils.isEmpty(newWord.getText())){
                    wordViewModel.insert(WordEntity(newWord.getText().toString()))
                }
            }
        }
        findViewById<Button>(R.id.deleteWords).setOnClickListener{
            fun onClick(v:View?){
                wordViewModel.deleteAllWords()
            }
        }


        wordViewModel.getAllWords().observe(this,Observer<List<WordEntity>>(){
            fun onChanged(words:List<WordEntity>){
            adapter.setWords(words)
        }
        })

    }

}
Run Code Online (Sandbox Code Playgroud)

有人可以帮我确定我做错了什么吗?在离开 Android 很长一段时间后,我试图选择架构组件。我不完全清楚如何进行。

小智 5

我遇到了同样的问题,并从这个博客中找到了解决方案。

你应该传递一个ViewModelProvider.AndroidViewModelFactoryViewModelProvider如下:

WordViewModel model = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(WordViewModel.class);


Run Code Online (Sandbox Code Playgroud)