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
Post a Comment