gpt4 book ai didi

android - Dagger 2 - 来自不同组件的模块

转载 作者:可可西里 更新时间:2023-11-01 18:46:14 27 4
gpt4 key购买 nike

我不太清楚如何用 dagger 2 解决这个问题。假设我们有 ApplicationModule 为我们提供 ApplicationContext然后我们有 ApplicationComponent 只使用这个模块。然后在它之上我们有 ActivityModuleActivityComponent 依赖于 ApplicationComponentActivityComponent 的构建就像

    ApplicationComponent component = ((MyApplication) getApplication()).getComponent();

mComponent = Dagger_ActivityComponent.builder()
.applicationComponent(component)
.activityModule(new ActivityModule(this))
.build();

然后我注入(inject)我的 Activity :

mComponent.inject(this);

现在我可以使用在我的 ActivityModule 中声明的所有内容,但是我无法访问 ApplicationModule

所以问题是如何实现这一点?这样当我构建依赖于另一个组件的组件时,我仍然可以从第一个组件访问模块?

编辑

我想我已经找到了解决方案,在重新观看之后Devoxx talk by Jake再次,我不得不错过这一点,无论我想从另一个组件模块使用什么,我都必须在该组件中提供,例如我想使用 ApplicationModule 中的 Context 然后在 ApplicationComponent 我必须声明 Context provideContext(); 它将可用。很酷:)

最佳答案

您已经回答了您的问题,但答案是在您的“超作用域”组件 (ApplicationComponent) 中指定提供方法。

例如,

@Module
public class ApplicationModule {
@Provides
@Singleton
public Something something() {
return new Something.Builder().configure().build();
// if Something can be made with constructor,
// use @Singleton on the class and @Inject on the constructor
// and then the module is not needed
}
}

@Singleton
@Component(modules={ApplicationModule.class})
public interface ApplicationComponent {
Something something(); //PROVISION METHOD. YOU NEED THIS.
}

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}

@ActivityScope
public class OtherThing {
private final Something something;

@Inject
public OtherThing(Something something) {
this.something = something;
}
}

@Component(dependencies = {ApplicationComponent.class})
@ActivityScope
public interface ActivityComponent extends ApplicationComponent { //inherit provision methods
OtherThing otherThing();
}

关于android - Dagger 2 - 来自不同组件的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28047035/

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