Интеграция с рукояткой приводит к аварийному завершению работы приложения 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 ответов
Для меня сработало:
- удалила аннотацию «@AndtoidEntryPoint» из действия.
- Затем прогнал код. конечно, не получилось.
- У меня был фрагмент внутри активности. Итак, я удалил и фрагмент кода.
- Затем прогнал код. это не удалось.
- Затем снова добавили аннотацию «@AndtoidEntryPoint» к действию.
- Затем прогнал код. Он запустился, и ошибка исчезла.
Для меня в качестве объявления зависимости внутри моего приложения build.gradle мне пришлось использовать api вместо реализации :
api project (': функции: feedModule')
Подробнее читайте здесь: https://github.com/google/dagger/issues/2064.
- Удалена аннотация @AndtoidEntryPoint из активности.
- Запустил код. конечно, не получится.
- Снова добавьте "@AndtoidEntryPoint"
- Чистый проект
В моем случае я получал похожий
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»), перезапустить приложение и проверить, работает ли оно. Если это сработает, переименуйте класс обратно в исходное.
У меня была такая же проблема, и вот шаги, которые я выполнил:
appModule начинается с внутреннего описания изображения, введите здесь
На уровне вашего приложения build.gradle внутри раздела Android добавьте следующую строку:
enableExperimentalClasspathAggregation = true }
Мои зависимости в следующем порядке:
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
теперь устарело,
В моем случае я дважды устанавливал 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"