公开Android库中定义的Dagger组件

公开Android库中定义的Dagger组件,android,dagger-2,aar,Android,Dagger 2,Aar,一个gradle模块中的Android应用程序如何包含另一个Android库(.aar)中定义的dagger@模块 我正在尝试建立一个通用库,它提供一组通过dagger@Module定义的功能,能够将它们注入依赖于该库的应用程序中 @Singleton @Component(modules = { AndroidSupportInjectionModule.class, LibraryAppModule.class }) public interface Libr

一个gradle模块中的Android应用程序如何包含另一个Android库(.aar)中定义的dagger@模块

我正在尝试建立一个通用库,它提供一组通过dagger@Module定义的功能,能够将它们注入依赖于该库的应用程序中

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        LibraryAppModule.class
})
public interface LibraryComponent extends AndroidInjector<DaggerApplication> {
    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        LibraryComponent build();
    }

    void inject(LibraryApplication app);

    @Override
    void inject(DaggerApplication instance);
}
现在,在对该库(build.gradle)具有依赖关系的应用程序中,我尝试了以下方法:

implementation project(":Library")
应用程序使用库

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        LibraryAppModule.class
})
public interface ExampleApplicationComponent extends AndroidInjector<DaggerApplication> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        ExampleApplicationComponent build();
    }

    void inject(ExampleApplication app);

    @Override
    void inject(DaggerApplication instance);
}

我希望在使用@Inject的活动中可以看到LibraryAppModule的服务。我做错了什么?

希望将属性注入的类应该调用
inject()

由于您希望在
main活动中插入
serviceFoo
,因此应该从
onCreate()
调用
inject()
。但是,在哪里定义了
inject()
供您调用呢?因此,您还需要在
ExampleApplicationComponent
中声明
inject()


综上所述,看来你对匕首的理解还不完整。推荐博文。

为了解决问题,需要做两件事

  • main活动
    必须扩展
    daggerappcompativity
    (这确保在我们的活动的
    onCreate()
    期间调用
    inject()
    ,但要使其起作用,需要为该活动提供一个
    androidjector
  • 这是通过在我定义并安装到
    示例应用程序组件中的模块中使用
    @ContributesAndroidInjector
    实现的
  • 现在在
    MainActivity
    中,我希望从库模块注入的服务是非空的

    下面是一个git提交,它显示了实现此修复的区别。


    希望这能帮助其他尝试使用库中提供的
    @Modules
    执行多模块Dagger Android项目的人。

    你能发布错误吗?我创建了一个示例项目来强调这个问题:如果你在MainActivity上设置一个断点。java:25,你会看到serviceFoo和serviceBar都为null,并且没有注入/INSTATITED。我会读一读那篇文章。谢谢。我说过注入调用是我扩展DaggerApplication的一部分,但我确实注意到我的主要活动不是扩展DaggerCompataActivity,它会修复,看看是否有帮助。我下面给出的答案也会起作用,但需要你在活动中创建一个额外的生成器。您使用AndroidJector的方法更好,因为它避免了代码重复。
    public class MainActivity extends AppCompatActivity {
    
        @Inject
        ServiceFoo serviceFoo;
    
        @Inject
        ServiceBar serviceBar;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            serviceFoo.downloadImages();
    
            serviceBar.uploadImages();
        }
    }
    
    public class MainActivity extends AppCompatActivity {
    
        @Inject
        ServiceFoo serviceFoo;
    
        @Inject
        ServiceBar serviceBar;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            serviceFoo.downloadImages();
    
            serviceBar.uploadImages();
        }
    }
    
    @Module
    public abstract class ExampleApplicationActivityBuilder {
    
        @ContributesAndroidInjector
        abstract MainActivity bindMainActivity();
    }