Кинжал 2 «Превосходный компонент кинжала» не может скомпилировать? Автоматически сгенерированный класс

Я пытаюсь использовать Кинжал 2 на андроиде. Раньше я работал, и у меня были приложения appModule для инъекций в определенные классы в приложении. Моя проблема в том, что iam получает ошибку

Error:(14, 55) error: cannot find symbol class DaggerAppComponent 

Которые пытаются импортировать. Это автогенерируемый класс

Ниже указаны мои зависимости от кинжала в файле build.gradle

  compile 'com.google.dagger:dagger-compiler:2.0.2' compile 'com.google.dagger:dagger:2.0.2' provided 'javax.annotation:jsr250-api:1.0' 

Ive пытался очистить и восстановить приложение несколько раз, но класс не будет генерировать. Я также попытался использовать

  compile 'org.glassfish:javax.annotation:10.0-b28' 

Для моих аннотаций, но мне не повезло? Если кто-то может мне помочь, признайте его. Его трудно понять, что сейчас происходит для меня? благодаря

EDIT: Компонентный код, который работал раньше, и я добавил только один дополнительный класс для ввода в?

 @Singleton @Component(modules = AppModule.class) public interface AppComponent { void inject(RegHelper reghelper); void inject(headerFooterRecViewAdapter headadapter); void inject(SectionListExampleActivity seclistactivity); } 

Solutions Collecting From Web of "Кинжал 2 «Превосходный компонент кинжала» не может скомпилировать? Автоматически сгенерированный класс"

Пожалуйста, добавьте

 apt 'com.google.dagger:dagger-compiler:2.x' 

К файлу сборки build.gradle

Создав автономный проект в Android Studio 2.3, я обновил файлы градиента по умолчанию следующим образом, чтобы получить сгенерированный файл Component. Добавленные строки имеют комментарий // dagger2 addition

PROJECT build.gradle :

 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.1' // dagger2 addition classpath 'com.android.tools.build:gradle:1.0.0' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.+' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() // dagger2 addition mavenCentral() maven{ url 'https://oss.sonatype.org/content/repositories/snapshots/' } } } task clean(type: Delete) { delete rootProject.buildDir } 

APP MODULE build.gradle :

 apply plugin: 'com.android.application' apply plugin: 'com.neenbedankt.android-apt' // dagger2 addition android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.demo.dagger2demo" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.0' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' // dagger2 addition compile 'com.google.dagger:dagger:2.+' apt "com.google.dagger:dagger-compiler:2.+" } 

Вам нужно установить этот плагин https://bitbucket.org/hvisser/android-apt, чтобы Android Studio мог видеть компоненты кинжала.

Просто добавьте @Module в класс Api и перестройте проект.

У меня была аналогичная проблема с Dagger 2. У меня был AppComponent и ActivityComponent (являющийся подкомпонентом). И как только я добавлю новую функцию inject () в AppComponent, я получу вышеуказанные ошибки.

Было больше ошибок, кроме ошибки «не найти символ», но они были очень расплывчатыми, и я не мог отлаживать свои проблемы. После копания и исследования stackoverflow и различных учебников я понял, что неправильно использовал Кинжал. В частности, был настроен мой AppComponent и ActivityComponent.

Я был в предположении, что я мог бы вводить свою «активность» или «фрагмент» как с моим AppComponent, так и с ActivityComponent. Это оказалось неправильным, по крайней мере, я узнал, что это не правильный способ использования Кинжала.

Мое решение:

AppComponent

 @Singleton @Component(modules = {AppModule.class}) public interface AppComponent { void inject(MyApp application); void inject(ContextHelper contextHelper); // for exports MyApp application(); PrefsHelper prefsHelper(); } 

Модуль приложения

 @Module public class AppModule { private final MyApp application; public AppModule(MyApp application) { this.application = application; } @Provides @Singleton public MyApp application() { return this.application; } @Provides @Singleton public PrefsHelper providePrefsHelper() { PrefsHelper prefsHelper = new PrefsHelper(application); return prefsHelper; } } 

ActivityComponent

 @ActivityScope @Component (dependencies = {AppComponent.class}, modules = {ActivityModule.class}) public interface ActivityComponent { void inject(MainActivity activity); void inject(OtherActivity activity); void inject(SomeFragment fragment); } 

ActivityModule

 @Module public class ActivityModule { private final MyActivity activity; public ActivityModule(MyActivity activity) { this.activity = activity; } @Provides @ActivityScope public ContextHelper provideContextHelper(MyApp application) { // My ContextHelper depends on certain things from AppModule // So I call appComponent.inject(contextHelper) AppComponent appComponent = application.getAppComponent(); ContextHelper contextHelper = new ContextHelper(activity); appComponent.inject(contextHelper); return contextHelper; } } 

заявка

 public class MyApp extends Application { private AppComponent appComponent; @Override public void onCreate() { super.onCreate(); initializeDepInj(); } private void initializeDepInj() { appComponent = DaggerAppComponent.builder() .appModule(new AppModule(this)) .build(); appComponent.inject(this); } public LockAppComponent getAppComponent() { return appComponent; } } 

Мероприятия

 public class MainActivity extends AppCompatActivity { // I get it from ActivityModule @Inject ContextHelper contextHelper; // I get it from AppModule @Inject PrefsHelper prefsHelper; ActivityComponent component; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupInjection(); } protected void setupInjection() { MyApp application = (MyApp) getApplication(); component = DaggerActivityComponent.builder() .appComponent(application.getAppComponent()) .activityModule(new ActivityModule(this)) .build(); component.inject(this); // I was also doing the following snippet // but it's not the correct way since the ActivityComponent depends // on AppComponent and therefore ActivityComponent is the only // component that I should inject() with and I'll still get classes // that are provided by the AppComponent/AppModule // application.getAppComponent().inject(this); // this is unneccessary } public ContextHelper getContextHelper() { return contextHelper; } } 

Я не знаю, разрешает ли он вашу проблему, но она должна хотя бы пролить свет на то, как правильно использовать кинжал.

Надеюсь, поможет.

У меня была такая же проблема с моей установкой, Android Studio 2.2 в следующем классе приложений:

 public class NetApp extends Application { private NetComponent mNetComponent; @Override public void onCreate() { super.onCreate(); // Dagger%COMPONENT_NAME% mNetComponent = DaggerNetComponent.builder() // list of modules that are part of this component need to be created here too .appModule(new AppModule(this)) // This also corresponds to the name of your module: %component_name%Module .netModule(new NetModule("https://api.github.com")) .build(); // If a Dagger 2 component does not have any constructor arguments for any of its modules, // then we can use .create() as a shortcut instead: // mNetComponent = com.codepath.dagger.components.DaggerNetComponent.create(); } public NetComponent getNetComponent() { return mNetComponent; } } 

Я использую следующую декларацию градации для кинжала 2:

 //Dagger 2 // apt command comes from the android-apt plugin apt 'com.google.dagger:dagger-compiler:2.7' compile 'com.google.dagger:dagger:2.7' provided 'javax.annotation:jsr250-api:1.0' 

Я мог бы решить проблему, восстановив полный проект (с ошибками), а затем добавив импорт DaggerNetComponent, который раньше отсутствовал.

Добавьте в свой класс build.gradle следующее:

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'