Android Dagger2多模块设计

Android Dagger2多模块设计,android,design-patterns,dagger-2,Android,Design Patterns,Dagger 2,对于发行版,我计划将模块拆分为几个小模块,以便在其他项目上重复使用 应用程序模块包含很多东西,我可以将其分为三种类型。 A型相关,B型相关,C型相关 所以我想把它放在三个不同的模块中,因此如果需要的话,它可以在其他项目上重复使用它的一部分 参考 用于应用程序的build.gradle buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1

对于发行版,我计划将模块拆分为几个小模块,以便在其他项目上重复使用

应用程序模块包含很多东西,我可以将其分为三种类型。 A型相关,B型相关,C型相关

所以我想把它放在三个不同的模块中,因此如果需要的话,它可以在其他项目上重复使用它的一部分

参考

用于应用程序的build.gradle

buildscript {
repositories {
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:1.1.0'
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
    }
}
allprojects {
    repositories {
        mavenCentral()
    }
}
应用程序模块的build.gradle

apply plugin: 'com.neenbedankt.android-apt'
//below lines go to dependenc
compile 'com.google.dagger:dagger:2.0'
apt 'com.google.dagger:dagger-compiler:2.0'
provided 'org.glassfish:javax.annotation:10.0-b28'
完成以上步骤后,我将创建我的应用程序模块

@dagger.Module
public class MyApplicationModule {
  void inject(MyApplication application);
}
还有我的组件

@Singleton
@Component(
        modules = {TypeA.class, TypeB.class, TypeC.class})
public interface MyApplicationComponent {
当我在活动中使用它时,它看起来像

@Component(dependencies = MyApplicationComponent.class,
        modules = ActivityModule.class)
public interface ActivityComponent {

    void injectActivity(SplashScreenActivity activity);
存在编译问题

错误:(22,10)错误:如果没有 @提供-或@products带注释的方法。 com.myapplication.mXXX [类型的注入字段: XXX]

我猜在配置从应用程序组件扩展而来的活动组件时出现了一些错误

我的目的是在应用程序组件内创建一些单例对象,活动将注入相同的对象,以减少每次在活动上创建一些对象。
我的设计错了吗??或者需要为配置做的任何其他事情???

找出根本原因来自@Scope

需要公开该类型以供其他子组件使用

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
如果我们想公开应用程序的上下文

@Singleton
@Component(
         {TypeA.class, TypeB.class, TypeC.class})
public interface MyApplicationComponent {

    void inject(MyApplication application);

    @ForApplication
    Context appContext();
当我的子组件想要扩展此

@ActivityScope
@Component(dependencies = MyApplicationComponent.class,
        modules = ActivityModule.class)
public interface ActivityComponent extends MyApplicationComponent {

    void injectActivity(Activity activity);
我认为这对于Dagger2来说是一件好事,它可以让你手动公开你需要使用的对象,代码变得更具可追踪性