【问题标题】:Hilt integration crashes application MainActivity_GeneratedInjectorHilt 集成使应用程序 MainActivity_GeneratedInjector 崩溃
【发布时间】:2020-08-10 07:18:48
【问题描述】:

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

   

【问题讨论】:

    标签: android dagger-hilt


    【解决方案1】:

    什么对我有用:

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

    【讨论】:

    • 非常感谢 - 你是个传奇!!,有一个 Jetpack MainActivity,只是切断 @AndroidEntryPoint 然后运行应用程序。它按预期崩溃了。然后我粘贴了@AndroidEntryPoint,它工作正常。你是个传奇。
    • 非常感谢,它对我也有用,与 Jetpack Compose 一起使用。
    • 我不敢相信这对我们所有人都有效。谷歌的新库,我们必须做的相当于关闭它然后重新打开。
    • 把它关掉然后再打开就太棒了!为我工作,仅用于撰写活动。有更深入了解的人可以帮助解释为什么会这样吗?
    【解决方案2】:

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

    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
        }
    

    【讨论】:

    • 将这些行添加到 build.gradle 对我有用。
    【解决方案3】:

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

    来自docs

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

    【讨论】:

      【解决方案4】:
      1. 从活动中删除了“@AndtoidEntryPoint”注释。
      2. 运行代码。当然,它会失败。
      3. 再次添加“@AndtoidEntryPoint”
      4. 清理项目

      【讨论】:

        【解决方案5】:

        通过为 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 注入视图模型的 Plus 片段及其活动都被注释为 @AndroidEntryPoint

        【讨论】:

        • 我也有同样的问题,但这并不能解决我的问题
        • 我在解决方案中更新了一些依赖项。
        • 一个解决方案是不只是添加依赖直到它工作,如果你不使用带刀柄的workmanager,你不需要androidx编译器。
        • 嗨 VishalPawar 我同意@AndréRamon androidx 注释处理器仅在您使用 WorkManager 时才需要,如developer.android.com/training/dependency-injection/… 官方 android 文档中所述。尽管在我的情况下也添加了依赖项,但在我看来,这是在不小心使用了一些 hack 的情况下。因此,请更新您的答案以反映这些发现
        【解决方案6】:

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

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

        【讨论】:

        • 对我来说也是如此...学习 Hilt 浪费了 1 天时间试图弄清楚我做错了什么,这解决了问题。
        【解决方案7】:

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

        【讨论】:

        • 这不是正确的答案
        【解决方案8】:

        即使代码正确,Dagger 有时也无法正常工作。

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

        【讨论】:

          【解决方案9】:

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

          【讨论】:

          • 又出事了,这次是我忘记为那个特定的模块添加hilt依赖了。
          【解决方案10】:

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

          【讨论】:

            【解决方案11】:

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

            1. appModule 以 internal 开头 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'```
              

            【讨论】:

              【解决方案12】:

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

              就像Sher Sanginov说的那样,不要使用增加编译时间的“api”,你可以在你的build.gradle(app)中添加以下行

              hilt {
                  enableAggregatingTask = true
              }
              

              enableExperimentalClasspathAggregation 现已弃用,

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-03-04
                • 2016-05-21
                • 2015-06-15
                • 1970-01-01
                • 2018-04-12
                • 1970-01-01
                相关资源
                最近更新 更多