公开 Android 库中定义的 Dagger 组件
Exposing Dagger Components defined in an Android Library
一个 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 的活动中可用。我做错了什么?
想要将 属性 注入其中的 class 应该调用 inject()
!
因为你想在 MainActivity
中注入 serviceFoo
,你应该从 onCreate()
调用 inject()
。但是,inject()
定义在哪里让你调用它?因此,您在 ExampleApplicationComponent
.
中另外声明 inject()
综上所述,看来你对匕首的理解还不全面。推荐this博客post.
要解决此问题,需要完成 2 件事。
MainActivity
必须扩展 DaggerAppCompatActivity
(这确保在 onCreate()
期间我们的 Activity 调用了 inject()
,但为了它在那里工作Activity. 需要 AndroidInjector
- 这是通过在我定义并安装到
ExampleApplicationComponent
的模块中使用 @ContributesAndroidInjector
来完成的
@Module
public abstract class ExampleApplicationActivityBuilder {
@ContributesAndroidInjector
abstract MainActivity bindMainActivity();
}
现在在 MainActivity
中,我要从库模块注入的服务是非空的。
这是一个 git 提交,显示了实施此修复的不同之处。
https://github.com/PeregrineFalcon/DaggerExampleLibrary/commit/1ebfdecfa3684c7ac124b9f6a4cecd23712a74fd
希望这对尝试使用库提供的 @Modules
进行多模块 Dagger Android 项目的其他人有所帮助。
一个 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 的活动中可用。我做错了什么?
想要将 属性 注入其中的 class 应该调用 inject()
!
因为你想在 MainActivity
中注入 serviceFoo
,你应该从 onCreate()
调用 inject()
。但是,inject()
定义在哪里让你调用它?因此,您在 ExampleApplicationComponent
.
inject()
综上所述,看来你对匕首的理解还不全面。推荐this博客post.
要解决此问题,需要完成 2 件事。
MainActivity
必须扩展DaggerAppCompatActivity
(这确保在onCreate()
期间我们的 Activity 调用了inject()
,但为了它在那里工作Activity. 需要 - 这是通过在我定义并安装到
ExampleApplicationComponent
的模块中使用
AndroidInjector
@ContributesAndroidInjector
来完成的
@Module
public abstract class ExampleApplicationActivityBuilder {
@ContributesAndroidInjector
abstract MainActivity bindMainActivity();
}
现在在 MainActivity
中,我要从库模块注入的服务是非空的。
这是一个 git 提交,显示了实施此修复的不同之处。 https://github.com/PeregrineFalcon/DaggerExampleLibrary/commit/1ebfdecfa3684c7ac124b9f6a4cecd23712a74fd
希望这对尝试使用库提供的 @Modules
进行多模块 Dagger Android 项目的其他人有所帮助。