【发布时间】:2019-08-30 04:30:09
【问题描述】:
一个 gradle 模块中的 Android 应用程序如何包含在另一个 Android 库 (.aar) 中定义的 dagger @Modules?
我正在尝试拥有一个通用库,它提供一组通过 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);
}
@Module
public class LibraryAppModule {
@Provides
@Singleton
Context provideContext(Application application) {
return application;
}
@Singleton
@Provides
ServiceFoo provideServiceFoo(Context context) {
return new ServiceFoo(context);
}
@Singleton
@Provides
ServiceBar provideServiceBar(Context context, ServiceFoo serviceFoo) {
return new ServiceBar(context, serviceFoo);
}
}
现在,在依赖于该库的应用程序 (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);
}
这是我遇到问题的地方的一个例子(一个空对象)。这是在依赖于库的单独模块中。
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();
}
}
我希望看到 LibraryAppModule 的服务在我使用 @Inject 的活动中可用。我做错了什么?
【问题讨论】:
-
你能发布错误吗?
-
我已经创建了一个示例项目来突出这个问题:github.com/PeregrineFalcon/DaggerExampleLibrary 如果你在 MainActivity.java:25 设置一个断点,你会看到 serviceFoo 和 serviceBar 都是 null 并且没有注入/实例化。