无法创建androidviewmodel实例

10 浏览
0 Comments

无法创建androidviewmodel实例

我正在使用Room和ViewModel开发一个笔记应用程序,但在Activity中初始化ViewModel时,遇到以下问题:

java.lang.RuntimeException: 无法创建类package.notes.homeScreen.HomeScreenVM的实例

这是我的主要Activity:

class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding

private lateinit var viewModel: HomeScreenVM

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setUI()

setViewModel()

}

private fun setUI() {

binding = ActivityMainBinding.inflate(layoutInflater)

setContentView(binding.root)

}

private fun setViewModel() {

viewModel = ViewModelProvider(this, HomeScreenViewModelFactory(this.application))[HomeScreenVM::class.java]

}

}

ViewModel的代码如下:

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

//一些方法

}

而我的ViewModel工厂类如下:

class HomeScreenViewModelFactory(private val application: android.app.Application) : ViewModelProvider.AndroidViewModelFactory(application) {

@Suppress("UNCHECKED_CAST")

override fun create(modelClass: Class): T {

if (modelClass.isAssignableFrom(HomeScreenVM::class.java))

return HomeScreenVM(application) as T

throw IllegalArgumentException("未知的模型类")

}

}

我不知道问题出在哪里,请帮助我。提前感谢。

更新:

完整的堆栈跟踪如下:

    Process: com.nitkkr.sanjay.notes, PID: 32750
    java.lang.RuntimeException: 无法启动组件信息{com.nitkkr.sanjay.notes/com.nitkkr.sanjay.notes.homeScreen.MainActivity}:java.lang.RuntimeException:无法创建类com.nitkkr.sanjay.notes.homeScreen.HomeScreenVM的实例
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3536)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3708)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2143)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:236)
        at android.app.ActivityThread.main(ActivityThread.java:8087)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
     Caused by: java.lang.RuntimeException: 无法创建类com.nitkkr.sanjay.notes.homeScreen.HomeScreenVM的实例
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:315)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:273)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:182)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:151)
        at com.nitkkr.sanjay.notes.homeScreen.MainActivity.setViewModel(MainActivity.kt:29)
        at com.nitkkr.sanjay.notes.homeScreen.MainActivity.onCreate(MainActivity.kt:17)
        at android.app.Activity.performCreate(Activity.java:8157)
        at android.app.Activity.performCreate(Activity.java:8129)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3509)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3708) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2143) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:236) 
        at android.app.ActivityThread.main(ActivityThread.java:8087) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) 
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:307)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:273) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:182) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:151) 
        at com.nitkkr.sanjay.notes.homeScreen.MainActivity.setViewModel(MainActivity.kt:29) 
        at com.nitkkr.sanjay.notes.homeScreen.MainActivity.onCreate(MainActivity.kt:17) 
        at android.app.Activity.performCreate(Activity.java:8157) 
        at android.app.Activity.performCreate(Activity.java:8129) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3509) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3708) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2143) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:236) 
        at android.app.ActivityThread.main(ActivityThread.java:8087) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) 
     Caused by: java.lang.RuntimeException: 无法找到com.nitkkr.sanjay.notes.data.database.NoteDatabase的实现。NoteDatabase_Impl不存在
        at androidx.room.Room.getGeneratedImplementation(Room.java:100)
        at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:1486)
        at com.nitkkr.sanjay.notes.data.database.NoteDatabase$Companion.getInstance(NoteDatabase.kt:24)
        at com.nitkkr.sanjay.notes.data.database.NoteRepository.(NoteRepository.kt:11)
        at com.nitkkr.sanjay.notes.homeScreen.HomeScreenVM.(HomeScreenVM.kt:12)
        at java.lang.reflect.Constructor.newInstance0(Native Method) 
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343) 
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:307) 
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:273) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:182) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:151) 
        at com.nitkkr.sanjay.notes.homeScreen.MainActivity.setViewModel(MainActivity.kt:29) 
        at com.nitkkr.sanjay.notes.homeScreen.MainActivity.onCreate(MainActivity.kt:17) 
        at android.app.Activity.performCreate(Activity.java:8157) 
        at android.app.Activity.performCreate(Activity.java:8129) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3509) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3708) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2143) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:236) 
        at android.app.ActivityThread.main(ActivityThread.java:8087) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) 

0
0 Comments

无法创建androidviewmodel实例的原因是与room数据库相关的问题,解决方法是使用ViewModelProvider来创建ViewModel实例,并传入正确的参数。

具体代码如下:

viewModel = ViewModelProvider(this, HomeScreenViewModelFactory(application)).get(HomeScreenVM::class.java)

希望这样能够解决该问题。可能是由于与room数据库相关的其他问题导致的,我已经找到了解决方案。感谢您的回答。

0