我看过几篇不同的文章,似乎在Dagger 2中提出了两种不同的自定义范围定义方法:
生存配置更改第2部分(Github repo)的MVP演示者:
@Hello1Scope
和@Hello2Scope
为Hello1Fragment
和Hello2Fragment
分别@PerFragment
。据我了解,似乎与方法2一样,可以定义一个可以用于所有片段(即@PerFragment
)的单一范围也可以。实际上(如果我错了,请纠正我),自定义范围的名称似乎无关紧要,只有在创建子组件的地方(即在Application,Activity或Fragment中)才是重要的。
是否存在用例为每个片段定义唯一范围的情况(例如情况1)?
阅读@vaughandroid的答案后,什么决定了Dagger 2中组件(对象图)的生命周期?我认为我对自定义范围的理解足够好,可以回答我自己的问题。
首先,在处理dagger2中的组件,模块和作用域注释时,有一些规则。
@Singleton
或@CustomScope
)。@Singleton
用于根组件(及其模块)。子组件必须使用自定义范围,但是该范围的功能与完全相同@Singleton
。现在,回答这个问题:我想为每个概念上不同的范围创建一个新的命名范围。例如,创建一个@PerActivity
,@PerFragment
或@PerView
注释,该注释指示应在何处实例化该组件,从而指示其寿命。
注意:这是两个极端之间的折衷。考虑您需要一个根组件和n个子组件的情况:
@Singleton
和@SubSingleton
),以及@Singleton
,@SubSingleton1
,...@SubSingletonN
)。应用:
/** AppComponent.java **/
@Singleton
@Component( modules = AppModule.class )
public interface AppComponent{
void inject(MainActivity mainActivity);
}
/** AppModule.java **/
@Module
public class AppModule{
private App app;
public AppModule(App app){
this.app = app;
}
// For singleton objects, annotate with same scope as component, i.e. @Singleton
@Provides @Singleton public App provideApp() { return app; }
@Provides @Singleton public EventBus provideBus() { return EventBus.getDefault(); }
}
分段:
/** Fragment1Component.java **/
@PerFragment
@Component( modules = {Fragment1Module.class}, dependencies = {AppComponent.class} )
public interface Fragment1Component {
void inject(Fragment1 fragment1);
}
/** Fragment1Module.java **/
@Module
public class Fragment1Module {
// For singleton objects, annotate with same scope as component, i.e. @PerFragment
@Provides @PerFragment public Fragment1Presenter providePresenter(){
return new Fragment1Presenter();
}
}
/** PerFragment.java **/
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerFragment {}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句