当前位置: 首页 > 知识库问答 >
问题:

使用Hilt依赖项注入时无法创建ViewModel实例

骆磊
2023-03-14

我只是从喷气背包和剑柄开始。但是当我注入到ViewModel中时,我遇到了一些问题。

我得到的错误:

java.lang.RuntimeException: Cannot create an instance of class com.example.chaes.login.viewModel.SignUpViewModel

Caused by: java.lang.InstantiationException: java.lang.Class<com.example.chaes.login.viewModel.SignUpViewModel> has no zero argument constructor

我可以在活动中注入所有细节,但不能在ViewModel中注入。我已经尝试了所有我能找到的解决办法。

我的gradle文件:

项目根级别:

buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.2.2"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.10"
        classpath 'com.google.gms:google-services:4.3.8'
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.37'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

模块级:

apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
kapt{
    correctErrorTypes true
}
dependencies {

    ...
    // Hilt
    implementation "com.google.dagger:hilt-android:2.37"
    kapt "com.google.dagger:hilt-android-compiler:2.37"
    ...
}

我的申请文件

@HiltAndroidApp
class BaseApplication: Application() {
}

我的模块文件:

@Module
@InstallIn(SingletonComponent::class)
object AuthRepoModule {
    @Singleton
    @Provides
    fun provideAuthRepo(): FirebaseAuthRepo{
        return FirebaseAuthRepo()
    }

    @Singleton
    @Provides
    fun provideRandomString(): String{
        return "gejifeg"
    }
}

项目是具有可组合屏幕的单个活动,因此主要活动:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() { ... }

视图模型:

@HiltViewModel
class SignUpViewModel @Inject constructor(
    firebaseAuthRepo: FirebaseAuthRepo,
) : ViewModel() { ... }

我尝试过的事情:

  • 改为ViewModelComponent而不是Singleton
  • 改为kapt"com.google.dagger: Hilt-Compiler: 2.37"而不是kapt"com.google.dagger: Hilt-android-Compiler: 2.37"
  • 删除构建文件夹并重建项目
  • 无效缓存并重启

编辑:找到解决方案!正如@sitatech在注释中提到的,需要使用hiltViewModel()而不是viewModel()来向可组合对象提供viewModel。

共有2个答案

苏晓博
2023-03-14

正如@sitatech在评论中提到的,我需要在composable中使用hiltViewModel()而不是viewModel()。

连翰
2023-03-14

应用内模块依赖项添加

...
// Hilt
implementation "com.google.dagger:hilt-android:2.37"
kapt "com.google.dagger:hilt-android-compiler:2.37"

implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
kapt "androidx.hilt:hilt-compiler:1.0.0-alpha03"
...

其他的部分对我来说似乎还可以。

 类似资料:
  • 我已经尝试了几种方法来将依赖项注入我的实现中,但没有任何效果。我已经尝试了几乎所有的stackoverflow线程。我正在使用HiberNate Validator来实现自定义验证。我希望被注入

  • 你好,我是android中MVVM的新手,正在使用livedata。我正在尝试创建viewmodel的一个实例。我觉得问题在于我没有将存储库传递给viewmodel构造函数。我一直无法创建viewmodel的实例。我不知道该怎么做这里是我的viewmodel和它的创建。

  • 在阅读dagger 2的文档时,我找不到一种简单的方法来在构建测试应用时提供依赖项。我找到的唯一线索是: 匕首2不支持覆盖。覆盖简单测试假货的模块可以创建模块的子类来模拟该行为。应该分解使用覆盖并依赖依赖依赖项注入的模块,以便将被覆盖的模块表示为两个模块之间的选择。 我不明白我将如何在Android上设置这样的配置,任何人都可以解释吗?

  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。

  • 我有一个集成了spring框架的maven项目,我使用这个项目为移动应用程序构建web服务。当我在AWS ubuntu服务器上部署该项目时,该项目给出了BeanCreationException并且它在Tomcat7上运行失败。当我在本地环境中运行它时,它工作得很好。下面是Tomcat7的错误日志。 TIA