即时集成使应用程序MainActivity_GeneratedInjector崩溃

时间:2020-08-10 07:18:48

标签: android dagger-hilt

尝试使用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

   

7 个答案:

答案 0 :(得分:8)

对我来说,作为应用程序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 :(得分:3)

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

答案 2 :(得分:3)

我花了几个小时来解决这个确切的问题,但通过使缓存/重启无效 + 重建所有模块解决了这个问题。

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

答案 3 :(得分:2)

就我而言,我得到了类似的ClassCastException,因为我的@HiltAndroidApp应用程序类所在的模块无法访问我的@AndroidEntryPoint活动所在的模块。将我的App类移动到可以访问所有其他Gradle模块的app模块即可解决了这个问题。

来自docs

因为Hilt的代码生成需要访问所有使用Hilt的Gradle模块,所以编译您的Application类的Gradle模块还需要在其传递依赖项中具有所有Hilt模块和构造函数注入的类。

答案 4 :(得分:0)

通过添加缺少的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"
都使用hilt注入viewmodel的

Plus片段及其活动被标注为 @AndroidEntryPoint

答案 5 :(得分:0)

对我有用的是:

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

答案 6 :(得分:0)

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