作者:陈珊君_387 | 来源:互联网 | 2023-01-18 17:10
我正在阅读这个很棒的教程,解释了@Component.Builder
Dagger 2中的工作方式.作者做得很好,文章很简单,但我仍需要澄清一些令人困惑的事情:Dagger 2的默认实现看起来像这样:
组件:
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
SharedPreferences getSharedPrefs();
}
模块:
@Module
public class AppModule {
Application application;
public AppModule(Application application) {
this.application = application;
}
@Provides
Application providesApplication() {
return application;
}
@Provides
@Singleton
public SharedPreferences providePreferences() {
return application.getSharedPreferences(DATA_STORE,
Context.MODE_PRIVATE);
}
}
组件实例化:
DaggerAppComponent appCompOnent= DaggerAppComponent.builder()
.appModule(new AppModule(this)) //this : application
.build();
根据文章,我们可以通过避免使用@Component.Builder
和@BindsInstance
注释向模块构造函数传递参数来进一步简化此代码,然后代码将如下所示:
组件:
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
SharedPreferences getSharedPrefs();
@Component.Builder
interface Builder {
AppComponent build();
@BindsInstance Builder application(Application application);
}
}
模块:
@Module
public class AppModule {
@Provides
@Singleton
public SharedPreferences providePreferences(
Application application) {
return application.getSharedPreferences(
"store", Context.MODE_PRIVATE);
}
}
并且组件实例化:
DaggerAppComponent appCompOnent= DaggerAppComponent.builder()
.application(this)
.build();
我几乎不懂上面的代码是如何工作的,但这里是我不明白的一部分:我们是怎么从获取appModule(new AppModule(this))
到application(this)
,当我们实例化的组件?
我希望这个问题很明确,谢谢.
1> David Medenj..:
tl; dr Dagger将自己创建任何无参数构造函数模型,如果您不传递它们,并且@BindsInstance
可能比从模块提供类型更好地优化使用.
首先,你有一个需要Application
构建的组件.因此,您构建模块并将其传递给组件.
现在,使用组件构建器,您可以将单个对象绑定到组件.这是我们上面所做的替代方案.不再需要模块,我们可以直接将Dagger交给我们在组件中所需的对象.
正如@Binds
提供界面实现一样,您通常可以假设Dagger可以并且将优化使用模块的简单方法之类的功能,因为意图更明确.
因此,使用@BindsInstance
将添加类型到我们的组件,以便我们不再需要模块来提供它.我们现在也可以从模块构造函数中删除参数.
当我们实例化组件时,我们是如何从appModule(新的AppModule(this))到应用程序(this)的?
由于Dagger本身可以实例化no-args模块,因此不再需要将模块显式添加到组件中,我们可以用新.application(this)
调用替换该行.