Интеграция с рукояткой приводит к аварийному завершению работы приложения MainActivity_GeneratedInjector

Попытка интегрировать рукоять с помощью документации по API Android, но приложение вылетело из-за следующего исключения. 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

   

17 ответов

Для меня сработало:

  1. удалила аннотацию «@AndtoidEntryPoint» из действия.
  2. Затем прогнал код. конечно, не получилось.
  3. У меня был фрагмент внутри активности. Итак, я удалил и фрагмент кода.
  4. Затем прогнал код. это не удалось.
  5. Затем снова добавили аннотацию «@AndtoidEntryPoint» к действию.
  6. Затем прогнал код. Он запустился, и ошибка исчезла.

Для меня в качестве объявления зависимости внутри моего приложения build.gradle мне пришлось использовать api вместо реализации :

api project (': функции: feedModule')

Подробнее читайте здесь: https://github.com/google/dagger/issues/2064.

  1. Удалена аннотация @AndtoidEntryPoint из активности.
  2. Запустил код. конечно, не получится.
  3. Снова добавьте "@AndtoidEntryPoint"
  4. Чистый проект

В моем случае я получал похожий ClassCastException потому что модуль, где мой @HiltAndroidApp класс приложения не имел доступа к модулю, в котором мой @AndroidEntryPointактивность была. Перемещение моего класса приложения в модуль приложения (у которого есть доступ ко всем другим модулям Gradle) решило проблему.

Из документов:

Поскольку для генерации кода Hilt требуется доступ ко всем модулям Gradle, которые используют Hilt, модуль Gradle, который компилирует ваш класс Application, также должен иметь все ваши модули Hilt и классы, внедренные конструктором, в своих транзитивных зависимостях.

Решил, добавив недостающую зависимость для рукояти androidx.

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"

Плюс фрагмент и его активность, которые вводят модель просмотра с помощью рукоятки, аннотируются как @AndroidEntryPoint

Я потратил пару часов на устранение этой точной проблемы, но решил ее, выполнив Invalidate cache / restart + Rebuilding всех модулей.

Это связано с этой проблемой из Hilt: Hilt: более значимые сообщения об ошибках.

Это решается недействительным кешем и перезапуском

Dagger иногда не работает, даже если код правильный.

Одно из возможных решений - переименовать класс во что-нибудь другое («Class2»), перезапустить приложение и проверить, работает ли оно. Если это сработает, переименуйте класс обратно в исходное.

У меня была такая же проблема, и вот шаги, которые я выполнил:

  1. appModule начинается с внутреннего описания изображения, введите здесь

  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

В моем случае я дважды устанавливал navGraph, что вызвало ошибку приведения:

Однажды в файле AndroidManifest.xml:

          <activity
        android:name=".MainActivity"
        android:exported="true"
        android:launchMode="singleTask"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustNothing"
        tools:ignore="LockedOrientationActivity">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <nav-graph android:value="@navigation/navigation_app_graph" />
    </activity>

И однажды в файле Activity_main.xml:

          <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/navigation_app_graph"
        tools:ignore="UnusedIds"
        tools:layout="@layout/fragment_mosaic" />

Атрибут nav-graph внутри тега Activity определяет граф навигации для действия MainActivity. Здесь вам следует настроить граф навигации для этого действия.

Вы можете удалить другое определение, которое находится внутри <androidx.fragment.app.FragmentContainerView>:

      app:navGraph="@navigation/navigation_app_graph"

В конце концов, граф навигации уже определен для основного действия, и вам не нужно определять его снова внутри FragmentContainerView.

Вы можете удалить папку сборки вашего приложения, а также удалить кеш сборки Gradle в вашей системе.

      rm -rf app/build

rm -rf ~/.gradle/caches/build-cache-1

Удаление только кеша сборки лучше, чем удаление всего кеша Android Studio.

Для меня это было то, что я забыл добавить @AndroidEntryPoint к родительскому действию, которое вызывало второе действие, а это - фрагмент. Очевидно, у каждого из них должен быть @AndroidEntryPoint.

В моем случае файл не содержит пакета, поэтому hilt не может сопоставить файл и сгенерировать его в сгенерированной папке. По этой причине,hiltне может разрешить файл.

я добавилpackage in the fragment, и это решает мою проблему

Шаги необходимо выполнить:

  • Удалить файл .gradle в каталоге приложения
  • Недействительный кеш и перезапустите студию Android

Надеюсь, это решит вашу проблему.

У меня было такое же исключение java.lang.ClassCastException после добавления Hilt. Шаги по устранению проблемы:

      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"
Другие вопросы по тегам