1
votes

I am trying to learn Dagger2 from this medium article and pass RequestQueue as an activity level dependency: https://proandroiddev.com/dagger-2-annotations-binds-contributesandroidinjector-a09e6a57758f I can create application components just fine but I am facing a lot of trouble with ContributesAndroidInjector. Application Class:

public class PokemonApplication extends Application {
    private static AppComponent appComponent;
    public static AppComponent getAppComponent(){
        return appComponent;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        appComponent=buildMyComponent();
    }

    private AppComponent buildMyComponent() {
        return DaggerAppComponent.builder().appmod(this).build();
    }


}

AppModule:

 @Module
    public abstract   class AppModule {
        @ContributesAndroidInjector(modules = VolleyModule.class)
        abstract MainActivity mainActivity();


        @Provides
        @Singleton
         static SharedPreferences providePreferences(Application application) {
            return application.getSharedPreferences("data", Context.MODE_PRIVATE);
        }
        @Provides
        @Singleton
        static Context getContext(Application application){
            return application.getApplicationContext();
        }

    }

AppComponent:

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

    void inject(MainActivity mainActivity); //Error here.

    @Component.Builder
    interface Builder
    {
        AppComponent build();
        @BindsInstance Builder appmod(Application application);


    }

}

VolleyModule:

@Module
public abstract class VolleyModule {


    @Provides
    static RequestQueue getRequestQueue(Context context) {
        return Volley.newRequestQueue(context);
    }
}

MainActivity:

 @Inject
    RequestQueue requestQueue;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PokemonApplication.getAppComponent().inject(this);
1

1 Answers

0
votes

VolleyModule has to be also declared in the list of modules in your Component

  @Singleton
  @Component(modules = {RetrofitModule.class,AppModule.class, VolleyModule.class})