Search code examples
androiddagger-2dagger

Dagger2 Subcomponent error - where have to annotate method ArrayAdapter


I use dagger2 demo by https://guides.codepath.com/android/Dependency-Injection-with-Dagger-2. I want to use subcomponent for ArrayAdapter injection in DemoDaggerSubActivity.java.

my Application.java

@Override public void onCreate() {
    super.onCreate();

    mApplicationComponent = DaggerApplicationComponent.builder()
            .applicationModule(new ApplicationModule(this))
            .build();
}


public ApplicationComponent getApplicationComponent() {
    return mApplicationComponent;
}

my MyActivityModule.java

@Module
public class MyActivityModule {
private final DemoDaggerSubActivity activity;

// must be instantiated with an activity
public MyActivityModule(DemoDaggerSubActivity activity) { this.activity = activity; }

@Provides
@MyActivityScope
@Named("my_list")
public ArrayAdapter providesMyListAdapter() {
    return new ArrayAdapter<String>(activity, android.R.layout.activity_list_item);
}

}

my MyActivitySubComponent.java

@MyActivityScope
@Subcomponent(modules={ MyActivityModule.class })
public interface MyActivitySubComponent {
    @Named("my_list") ArrayAdapter myListAdapter();
}

my ApplicationComponent.java

@Singleton
@Component( modules = {ApplicationModule.class} )
public interface ApplicationComponent {
void inject(DemoDaggerSubActivity activity);

// factory method to instantiate the subcomponent defined here (passing in the module instance)
MyActivitySubComponent newMyActivitySubcomponent(MyActivityModule activityModule);

}

my DemoDaggerSubActivity.java

@Inject @Named("my_list")
ArrayAdapter arrayAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

((AttendanceApplication) getApplication()).getApplicationComponent().newMyActivitySubcomponent(new MyActivityModule(this)).inject(this);

}

After project rebuild I have got error

enter image description here

Where have I to annotate method ArrayAdapter ?


Solution

  • Have to remove inject method from ApplicationComponent.java and put it to MyActivitySubComponent.java

    new MyActivitySubComponent.java

    @MyActivityScope
    @Subcomponent(modules={ MyActivityModule.class })
    public interface MyActivitySubComponent {
    
        void inject(DemoDaggerSubActivity activity);
    
        @Named("my_list") ArrayAdapter myListAdapter();
    }
    

    new ApplicationComponent.java

    @Singleton
    @Component( modules = {ApplicationModule.class} )
    public interface ApplicationComponent {
    
        // factory method to instantiate the subcomponent defined here (passing in the module instance)
        MyActivitySubComponent newMyActivitySubcomponent(MyActivityModule activityModule);
    
    }