我有些关于dagger2的问题,我觉得很难理解。此代码:
@Module
public class AppModule {
private MainApplication applicationContext;
@Inject
public AppModule(MainApplication context){
this.applicationContext = context;
}
@Provides
@Singleton
StuffA provideStuffA(){
return new StuffA();
}
@Provides
@Singleton
StuffB provideStuffB(StuffA){
return new StuffB(stuffA);
}
}在申请课程中:
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();我的第一个问题是:
第二个问题:
最后问题
PS。如果这真的是基本的东西,我很抱歉,但是我发现文档很差,也缺乏示例。高级致谢
发布于 2015-07-16 12:02:24
答案1
你只是把它们分成两个模块。匕首将构建图形,当某个时候调用provideStuffB()时,它将向它注入StuffA。顺便说一句,我认为provide方法中有小的语法错误,应该是(缺少stuffA参数):
@Provides
@Singleton
StuffB provideStuffB(StuffA stuffA){
return new StuffB(stuffA);
}答案2
是的,这是通常的方式。在创建图形(在onCreate()中)之后,就注入了this (应用程序)。请注意,在使用这种方法进行单元测试时,有一个微妙的警告--即使在调用Application方法之前,也会创建setUp()对象,因此您将无法设置/交换您的测试组件(并且您将始终使用默认组件)。解决方案是使用图形的延迟初始化,即当第一次活动(或服务,或BroadcastReceiver等)时。调用getApplication().getInjector(this)时,您必须在这一点上创建图形。
答案3
通常有一个包含所有模块和子组件的top Component。它必须能够注入所有的活动。事实上,顶部组件用于生成图形。下面是一个来自实际应用程序的例子:
@Component(modules = {IzgubenoDaggerModule.class,
AcraDaggerModule.class,
AppInfoDaggerModule.class,
SessionDaggerModule.class,
ComponentManagerDaggerModule.class,
NetworkInfoProviderDaggerModule.class,
DeviceInfoProviderDaggerModule.class,
KhRestExchangeManagerDaggerModule.class
})
@Singleton
public interface IzgubenoDaggerComponent extends GgLibDaggerComponent {
void inject(IzgubenoApplication app);
void inject(Act_Main act);
void inject(Act_ContactDetails act);
void inject(Act_MyPets act);
void inject(Act_PetEdit act);
void inject(Act_PetManage act);
void inject(Act_PetPics act);
//...
GgLibDaggerComponent newGgLibDaggerComponent(HttpsDaggerModule httpsMod,
KhRestDaggerModule khrestMod,
AppInfoDaggerModule appInfoMod,
GgServerDaggerModule ggServMod,
GgClientDaggerModule ggClientMod);
//...
}https://stackoverflow.com/questions/31384552
复制相似问题