Hilt 集成使应用程序崩溃 MainActivity_GeneratedInjector

Hilt integration crashes application MainActivity_GeneratedInjector

尝试使用 android Api 文档集成刀柄,但应用程序崩溃并出现以下异常。 https://developer.android.com/training/dependency-injection/hilt-android

java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.package.application/com.package.application.MainActivity}: 

java.lang.ClassCastException: com.package.application.DaggerAppApplication_HiltComponents_ApplicationC$ActivityRetainedCImpl$ActivityCImpl 
cannot be cast to com.package.application.MainActivity_GeneratedInjector

   

通过为 androidx hilt 添加缺少的依赖项解决了这个问题。

kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'

我的 gradle 文件中的其他依赖项。

implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02"
implementation 'com.google.dagger:hilt-android:2.28-alpha'
kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'
implementation "androidx.fragment:fragment-ktx:1.2.5"

Plus 片段及其 activity 使用 hilt 注入视图模型的都被注释为 @AndroidEntryPoint

在我的例子中,我得到了类似的 ClassCastException,因为我的 @HiltAndroidApp 应用程序 class 所在的模块无法访问我的 @AndroidEntryPoint 所在的模块] activity 了。将我的应用程序 class 移动到应用程序模块(可以访问所有其他 Gradle 模块)解决了问题。

来自docs

Because Hilt's code generation needs access to all of the Gradle modules that use Hilt, the Gradle module that compiles your Application class also needs to have all of your Hilt modules and constructor-injected classes in its transitive dependencies.

这通过使缓存无效并重新启动来解决

我花了几个小时解决这个确切的问题,但通过执行无效 cache/restart + 重建所有模块解决了它。

这与 Hilt 的这个问题有关: Hilt: More meaningful error messages

对我来说,作为 app build.gradle 中的依赖声明,我不得不使用 api 而不是 实施:

api 项目(':features:feedModule')

在此处了解更多信息:https://github.com/google/dagger/issues/2064

更新: Dagger 团队发布了可以解决此问题的类路径聚合功能。您可以在这里了解更多信息: https://dagger.dev/hilt/gradle-setup#classpath-aggregation

基本上,在您的应用程序模块 build.gradle 中,您需要添加:

hilt {
    enableExperimentalClasspathAggregation = true
}

如果你的Android Gradle项目中使用的插件版本低于7.0,请务必将此添加到你的build.gradle文件中:

android {
    ...
    lintOptions {
        checkReleaseBuilds false
    }

对我有用的:

  1. 从 activity 中删除了 @AndroidEntryPoint 注释。
  2. 运行 代码,当然,它失败了。
  3. 在 activity 中有一个片段。所以,我也删除了片段代码。
  4. 运行 代码,失败了。
  5. 再次将 @AndroidEntryPoint 注释添加到 activity。
  6. 运行 代码。它 运行 并且错误消失了。

对我来说,是我忘记将 @AndroidEntryPoint 添加到调用第二个 activity 的父 activity 而这个调用片段。显然他们每个人都需要有一个@AndroidEntryPoint

Dagger 有时不能正常工作,即使代码是正确的。

一种可能的解决方案是将 class 重命名为其他名称(“Class2”),重新运行该应用程序,然后检查它是否有效。如果有效,请将 class 重命名为原来的名称。

  1. 从 activity 中删除了“@AndtoidEntryPoint”注释。
  2. 运行 代码。当然会失败。
  3. 再次添加“@AndtoidEntryPoint”
  4. 清理项目

这确实是一个愚蠢的解决方案,但只需注释掉注入注释和注入字段,运行 应用程序然后取消注释它们并再次 运行

我遇到了同样的问题,以下是我遵循的步骤:

  1. appModule 以内部开始 enter image description here

  2. 在您的应用级别 build.gradle 内 android 部分添加以下行:

       enableExperimentalClasspathAggregation = true
    }
    
    
  3. 我的依赖项是这样的:

    
    classpath "com.google.dagger:hilt-android-gradle-plugin:2.40.5"
    
        app-level build.gradle: 
         top plugin section
    
     plugin{
      ...........
      id 'kotlin-kapt'
      id 'dagger.hilt.android.plugin'
     }
    
         dependencies section
         //dagger-hilt
     implementation 'com.google.dagger:hilt-android:2.40.5'
     kapt 'com.google.dagger:hilt-android-compiler:2.40.5'```
    

当我导入带有“实现”的 .aar 时,我也遇到过这种情况。 (包含刀柄的 .aar)

就像 所说的那样,而不是使用会增加编译时间的“api”,您可以在 build.gradle(app)

中添加以下行
hilt {
    enableAggregatingTask = true
}

enableExperimentalClasspathAggregation 现已弃用,

https://dagger.dev/hilt/gradle-setup#aggregating-task

我在添加 Hilt 后得到了相同的 java.lang.ClassCastException。 解决问题的步骤:

1. Build -> Clean Project
2. Build -> Rebuild Project

此外,kapt 不再起作用。只需添加一个插件:

id 'dagger.hilt.android.plugin'

然后,添加 Hilt 依赖项:

implementation "com.google.dagger:hilt-android:2.38.1"
annotationProcessor "com.google.dagger:hilt-compiler:2.38.1"

需要执行的步骤:

  • 删除应用程序目录中的 .gradle 文件
  • 使缓存无效并重新启动 android studio

希望它能解决您的问题。