无法创建类视图模型的实例 - Kotlin

Kae*_*rez 5 android viewmodel kotlin android-viewmodel

我目前正在开发一个项目来练习使用 Dagger-Hilt 进行依赖注入,但是我无法实例化我的 ViewModel,我已经查看了同一主题的其他一些问题,大多数问题都指向 Gradle,但是没有为我修复它,Stacktrace 中的所有错误都来自内部类,除了 MainActivity 中涉及我的 ViewModel 的两行之外

\n

这是堆栈跟踪:

\n
E/AndroidRuntime: FATAL EXCEPTION: main\nProcess: com.example.practiceproject, PID: 9873\njava.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.practiceproject/com.example.practiceproject.ui.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.practiceproject.ui.viewmodel.DogViewModel\n    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)\n    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)\n    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)\n    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)\n    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)\n    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)\n    at android.os.Handler.dispatchMessage(Handler.java:107)\n    at android.os.Looper.loop(Looper.java:214)\n    at android.app.ActivityThread.main(ActivityThread.java:7356)\n    at java.lang.reflect.Method.invoke(Native Method)\n    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)\n Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.practiceproject.ui.viewmodel.DogViewModel\n    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)\n    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)\n    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:112)\n    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:146)\n    at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:111)\n    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)\n    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)\n    at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:54)\n    at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41)\n    at com.example.practiceproject.ui.MainActivity.getDogViewModel(MainActivity.kt:15)\n    at com.example.practiceproject.ui.MainActivity.onCreate(MainActivity.kt:22)\n    at android.app.Activity.performCreate(Activity.java:7802)\n    at android.app.Activity.performCreate(Activity.java:7791)\n    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)\n    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)\n    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)\xc2\xa0\n    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)\xc2\xa0\n    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)\xc2\xa0\n    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)\xc2\xa0\n    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)\xc2\xa0\n    at android.os.Handler.dispatchMessage(Handler.java:107)\xc2\xa0\n    at android.os.Looper.loop(Looper.java:214)\xc2\xa0\n    at android.app.ActivityThread.main(ActivityThread.java:7356)\xc2\xa0\n    at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)\xc2\xa0\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)\xc2\xa0\n Caused by: java.lang.InstantiationException: java.lang.Class<com.example.practiceproject.ui.viewmodel.DogViewModel> has no zero argument constructor\n    at java.lang.Class.newInstance(Native Method)\n    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)\n    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)\xc2\xa0\n    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:112)\xc2\xa0\n    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:146)\xc2\xa0\n    at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:111)\xc2\xa0\n    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)\xc2\xa0\n    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)\xc2\xa0\n    at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:54)\xc2\xa0\n    at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41)\xc2\xa0\n    at com.example.practiceproject.ui.MainActivity.getDogViewModel(MainActivity.kt:15)\xc2\xa0\n    at com.example.practiceproject.ui.MainActivity.onCreate(MainActivity.kt:22)\xc2\xa0\n    at android.app.Activity.performCreate(Activity.java:7802)\xc2\xa0\n    at android.app.Activity.performCreate(Activity.java:7791)\xc2\xa0\n    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)\xc2\xa0\n    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)\xc2\xa0\n    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)\xc2\xa0\n    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)\xc2\xa0\n    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)\xc2\xa0\n    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)\xc2\xa0\n    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)\xc2\xa0\n    at android.os.Handler.dispatchMessage(Handler.java:107)\xc2\xa0\n    at android.os.Looper.loop(Looper.java:214)\xc2\xa0\n    at android.app.ActivityThread.main(ActivityThread.java:7356)\xc2\xa0\n    at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)\xc2\xa0\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)\xc2\xa0\n
Run Code Online (Sandbox Code Playgroud)\n

这是视图模型:

\n
class DogViewModel @Inject constructor(\nprivate val getDefaultImages: GetDefaultImages\n) : ViewModel() {\n\nval dogModel = MutableLiveData<DogModel>()\nval isLoading = MutableLiveData<Boolean>()\n\nfun onCreate() {\n    viewModelScope.launch {\n        isLoading.value = true\n        val result = getDefaultImages()\n        if(!result.isNullOrEmpty()) {\n            dogModel.value = result[0]\n            isLoading.value = false\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这就是我声明的地方:

\n
@AndroidEntryPoint\nclass MainActivity : AppCompatActivity() {\nprivate lateinit var binding: ActivityMainBinding\n\nprivate val dogViewModel: DogViewModel by viewModels()\n\noverride fun onCreate(savedInstanceState: Bundle?) {\n    super.onCreate(savedInstanceState)\n    binding = ActivityMainBinding.inflate(layoutInflater)\n    setContentView(binding.root)\n\n    dogViewModel.onCreate()\n\n    dogViewModel.dogModel.observe(this) {\n        initRecyclerView(it)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

小智 12

您应该@HiltViewModel在视图模型顶部添加注释。


Bha*_*ani 5

  1. 确保您已@AndroidEntryPoint在 Fragment 或 Activity 类上方写入。
  2. 你必须写@HiltViewModel在你的 ViewModel 类上面。
  3. 还要确保您提供以 ViewModel 编写的所有依赖项,例如存储库等。