android - Dagger2 multi-module design -
for dagger2 release , plan split module few small module re-use on other projects.
application module contains many things, can group 3 type. type related, type b related, type c related.
so want put 3 different module , therefore can re-use part of if need on other projects.
reference google's fork
build.gradle application
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.1.0' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' // note: not place application dependencies here; belong // in individual module build.gradle files } } allprojects { repositories { mavencentral() } }
build.gradle app module
apply plugin: 'com.neenbedankt.android-apt' //below lines go dependenc compile 'com.google.dagger:dagger:2.0' apt 'com.google.dagger:dagger-compiler:2.0' provided 'org.glassfish:javax.annotation:10.0-b28'
after above steps , going create application module
@dagger.module public class myapplicationmodule { void inject(myapplication application); }
and component
@singleton @component( modules = {typea.class, typeb.class, typec.class}) public interface myapplicationcomponent {
when use on activity , looks
@component(dependencies = myapplicationcomponent.class, modules = activitymodule.class) public interface activitycomponent { void injectactivity(splashscreenactivity activity);
there compile issue
error:(22, 10) error: xxxxxx cannot provided without @provides- or @produces-annotated method. com.myapplication.mxxx [injected field of type: xxx]
i guess there wrong when config activity component extends application component.
my purpose singleton object inside application component , activity inject same object reduce object create every time on activity. design wrong?? or other things need config??
find out root cause come @scope
need expose type other sub-component usage
@scope @retention(retentionpolicy.runtime) public @interface activityscope { }
if want expose context application ,
@singleton @component( {typea.class, typeb.class, typec.class}) public interface myapplicationcomponent { void inject(myapplication application); @forapplication context appcontext();
when sub-component want extend
@activityscope @component(dependencies = myapplicationcomponent.class, modules = activitymodule.class) public interface activitycomponent extends myapplicationcomponent { void injectactivity(activity activity);
i think great thing dagger2 , let manually expose object need use , code become more traceable.