公开Android库中定义的Dagger组件
一个gradle模块中的Android应用程序如何包含另一个Android库(.aar)中定义的dagger@模块 我正在尝试建立一个通用库,它提供一组通过dagger@Module定义的功能,能够将它们注入依赖于该库的应用程序中公开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
@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();
}