简体   繁体   中英

Dagger 2 “Dagger” prefix component not able to compile? auto generated class

Im trying to use Dagger 2 on android. I previously had it working and i had an appModule injecting dependencies into specific classes in the app. My Issue is that iam getting the error

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

which attempting to import. this is an autogenerated class

below are my Dagger specific dependencies in my build.gradle file

 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 tried cleaning and rebuilding the app numerous times but the class wont generate. Ive also tried using

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

for my annotations but Iam having no luck still? If anyone can help me out id appreciate. Its kind of difficult to see exactly what is going on for me at present? Thanks

EDIT: Component code this was working before and i just added 1 extra class to inject into?

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

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

}

Please add

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

to your app build.gradle file

Setting up a stand-alone project in Android Studio 2.3, I updated the default gradle files as follows to get the generated Component file. Added lines have comment // 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.+"
}

This did the trick for me with the (current) latest dagger dependecies.

`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"
}`

您需要安装此插件https://bitbucket.org/hvisser/android-apt ,以便Android Studio查看Dagger组件。

I was having a similar issue with Dagger 2. I had an AppComponent and an ActivityComponent (being a subcomponent). And as soon as I would add a new inject() function in the AppComponent, I would get the above errors.

There was more errors besides the 'cannot find symbol' error but they were very vague and I couldn't debug my issues. After digging and researching stackoverflow and different tutorials, I realized I was using Dagger incorrectly. Specifically the way my AppComponent and ActivityComponent was setup.

I was under the assumption that I could inject my 'Activity' or 'Fragment' with both my AppComponent and ActivityComponent. This turned out to be wrong, at least I found out that it wasn't the right way of using Dagger.

My Solution:

AppComponent

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

    void inject(MyApp application);
    void inject(ContextHelper contextHelper);

    // for exports
    MyApp application();
    PrefsHelper prefsHelper();
}

App Module

@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;
    }
}

Application

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;
    }
}

Activity

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;
    }
}

I don't know if it directly resolves your issue but it should at least shed some light on how to use Dagger properly.

Hope it helps.

I had the same problem on my setup, Android Studio 2.2 within the following application class:

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;
    }
}

I'm using the following gradle declaration for dagger 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'

I could solve the problem by rebuilding the complete project (with errors) and then adding the import of the that was missing before. 的导入来解决问题。

只需将@Module添加到Api类并重建项目即可。

Hope you all doing well. I was facing the same problem and spent a lot of time over stack overflow. At last I go through this and able to find solution. Briefly, You have to make some changes in your module level Gradle file. Please remove

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

at the top of the file. And replace

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

with

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

After that rebuild your project and you will be able to import your Dagger prefix classes. Hopw it will help you out.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM