[英]Cannot create an instance of class - ViewModel
I'm following an example of google, the example is in java but when I rewrite it in kotlin I can not instantiate the class.我正在关注 google 的一个例子,这个例子是在 java 中,但是当我在 kotlin 中重写它时,我无法实例化这个类。 I am learning viewmodel.我正在学习视图模型。 I have a lot of doubt if I messed up the syntax of my kotlin code.我很怀疑我是否搞砸了kotlin代码的语法。
https://github.com/googlecodelabs/android-room-with-a-view https://github.com/googlecodelabs/android-room-with-a-view
class MainActivity: AppCompatActivity() {类 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!!
}
@zunjae @zunjae
Errors错误
1 - Syntax code koltin. 1 - 语法代码 koltin。
2 - Project configuration. 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) {
... ...
add app build.gradle添加应用程序 build.gradle
apply plugin: 'kotlin-kapt'
kapt "android.arch.lifecycle:extensions:$rootProject.archLifecycleVersion"
kapt "android.arch.persistence.room:compiler:$rootProject.roomVersion"
I had the same issue, in JAVA though.我有同样的问题,但在 JAVA 中。 My issue was solved with using the ViewModelFactory as follows:使用 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);
}
And where you call the ViewModel, change it to:在调用 ViewModel 的地方,将其更改为:
mBookViewModel = new ViewModelProvider(this, new MyViewModelFactory
(this.getApplication())).get(BookViewModel.class);
You can check this link for this issue from the tutorial's Github issues page: https://github.com/googlecodelabs/android-room-with-a-view/issues您可以从教程的 Github 问题页面查看此问题的链接: https : //github.com/googlecodelabs/android-room-with-a-view/issues
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.