java - How to inject different dependencies for parent/child activities from multiple independent components using Dagger 2? -


i'm relatively new dagger 2, , kept running compiler error dagger 2 says missing @provide or @produces. i'm trying inject common components in base class, child class has own component. checked out several examples online , saw people using sub-component; still don't why can have multiple independent components each class? don't see why imagecomponent has sub-component of apicomponent, doesn't make sense. i'm wondering what's right approach regarding issue, or there alternative approach i'm not aware of? thanks.

api component

public interface userapi {      int getuser(); }  public interface searchapi {      int search(); }  @singleton @module public class apimodule {      public apimodule() {     }      @singleton     @provides     public searchapi providesearchapi() {         return new searchapi() {             @override             public int search() {                 return 0;             }         };     }      @singleton     @provides     public userapi provideuserapi() {         return new userapi() {             @override             public int getuser() {                 return 0;             }         };     } }  @singleton @component(modules = {     apimodule.class }) public interface apicomponent {      void inject(baseactivity activity); } 

image component

public interface imageloader {      boolean load(string url); }  @activityscope @module public class imagemodule {      @activityscope     @provides     public imageloader provideimageresource() {         return new imageloader() {             @override             public boolean load(string url) {                 return false;             }         };     } }  @activityscope @component(     modules = {         imagemodule.class     } ) public interface imagecomponent {     // dagger doesn't allow this? not sure why?     void inject(mainactivity activity); } 

activity , components singleton

public class components {      private apicomponent apicomponent;      private imagecomponent imagecomponent;      private static components singleton;      public static void initialize(context context) {         if (singleton != null) {             throw new runtimeexception("attempted initialize components twice");         }         singleton = new components(context);     }      public static components get() {         return singleton;     }      private components(context context) {         apicomponent = apicomponent             .builder()             .datamodule(new apimodule())             .build();          // can't generate image component yet     }      public apicomponent api() {         return apicomponent;     }      public imagecomponent image() {         return imagecomponent;     } } public abstract class baseactivity extends appcompatactivity {      @inject     protected userapi userapi;      @inject     protected searchapi searchapi;      @override     protected void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);         components.get().data().inject(this);     } }  public class mainactivity extends baseactivity {      @inject     protected imageloader imageloader;      @override     protected void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);         setcontentview(r.layout.activity_main);     } } 

stacktrace

error:(15, 10) error: android.com.dagger.data.userapi cannot provided without @provides- or @produces-annotated method. android.com.dagger.baseactivity.userapi [injected field of type: android.com.dagger.data.userapi userapi] 

base classes not sufficient injection targets. dagger 2 relies on typed classes, must specify explicitly ones should defined

you can't components.get().data().inject(this); this (i.e baseactivity abstract)


Comments

Popular posts from this blog

java - Run spring boot application error: Cannot instantiate interface org.springframework.context.ApplicationListener -

python - pip wont install .WHL files -

Excel VBA "Microsoft Windows Common Controls 6.0 (SP6)" Location Changes -