gpt4 book ai didi

android - 理解 Dagger 2 @Component.Builder 注解

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:54 25 4
gpt4 key购买 nike

我正在阅读 this很棒的教程,解释了 @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 ) 当我们实例化组件时?

我希望问题很清楚,谢谢。

最佳答案

tl;dr 如果您不传入任何无参数构造函数模型和使用 @BindsInstance,Dagger 将自行创建它们可能比从模块提供类型更好地优化。


首先,您有一个需要构建Application 的组件。因此,您构造模块并将其传递给组件。

现在,使用组件构建器,您只需将单个对象绑定(bind)到一个组件。这是我们上面所做的替代方法。不再需要模块,我们可以直接将组件中想要的对象交给 Dagger。
正如使用 @Binds 提供接口(interface)实现一样,您通常可以假设 Dagger 可以并且将比使用模块的简单方法更好地优化这些功能,因为 Intent 更明确。

因此使用@BindsInstance 会将类型添加到我们的组件中,这样我们就不再需要模块来提供它了。我们现在还可以从模块构造函数中删除参数。

how did we get from appModule(new AppModule(this)) to application(this) when we are instantiating the component?

由于 Dagger 本身可以实例化无参数模块,因此不再需要显式地将模块添加到组件中,我们可以用新的 .application(this) 调用替换该行。

关于android - 理解 Dagger 2 @Component.Builder 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46197410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com