Кинжал 2 "Кинжал" компонент префикса, который не может скомпилировать? автоматически сгенерированный класс

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

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

который пытается импортировать. это автогенерированный класс

ниже указаны мои зависимые зависимости Dagger в файле 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 попытался очистить и восстановить приложение несколько раз, но класс не будет генерировать. Ive также попытался использовать

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

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

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

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {

    void inject(RegHelper reghelper);
    void inject(headerFooterRecViewAdapter headadapter);
    void inject(SectionListExampleActivity seclistactivity);

}

Ответ 1

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

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

в файл build.gradle приложения

Ответ 2

Настройка автономного проекта в Android Studio 2.3, я обновил файлы по умолчанию gradle следующим образом, чтобы получить сгенерированный компонентный файл. Добавленные строки имеют комментарий // 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.+"
}

Ответ 3

Это сделало трюк для меня с (текущими) последними качествами кинжала.

`dependencies{
...
compile 'com.google.dagger:dagger:2.11'
compile 'com.google.dagger:dagger-android-support:2.11'
annotationProcessor "com.google.dagger:dagger-compiler:2.11"
}`

Ответ 5

У меня была аналогичная проблема с 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 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;
    }
}

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

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

Ответ 6

У меня была такая же проблема с моей установкой, 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;
    }
}

Я использую следующее объявление gradle для кинжала 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.

Ответ 7

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

Ответ 8

Надеюсь, вы все хорошо себя чувствуете. Я столкнулся с той же проблемой и потратил много времени на переполнение стека. Наконец, я прохожу через this и могу найти решение. Вкратце, вы должны внести некоторые изменения в свой файл уровня Gradle на уровне модуля. Удалите

apply plugin: 'com.neenbedankt.android-apt'

в верхней части файла. И замените

apt 'com.google.dagger:dagger-compiler:2.11'

с

annotationProcessor 'com.google.dagger:dagger-compiler:2.11'

После этого перестройте свой проект, и вы сможете импортировать классы префикса Dagger. Hopw это поможет вам.