【发布时间】:2017-10-17 06:18:22
【问题描述】:
我有一个注入 Presenter 的 MainActivity,presenter 对象注入交互器,交互器对象注入 APIHelper。所有 Presenter、Interactor 和 APIHelper 的提供者都在 MainModule 中。
@Module
public class MainActivityModule {
private final MainActivity activity;
//Context context;
public MainActivityModule (MainActivity activity) {
this.activity = activity;
}
@Provides
@Singleton
public MainViewPresenter providesMainPresenter(){
return new MainPresenterImpl(activity);
}
@Provides
@Singleton
ListingInteractor providesInteractor( ){
return new ListingInteractorImpl(activity);
}
@Provides
@Singleton
ApiHelper providesAPI( ){
return new ApiHelper(activity);
}
}
我在 MainActivity 中注入了组件,例如:
DaggerMainActivityComponent.builder()
.mainActivityModule(new MainActivityModule(MainActivity.this))
.build().inject(this);
在我的 Presenter 实现中,我有这样的交互器:
public class MainPresenterImpl implements MainViewPresenter {
Context context;
private MainView mainView;
// @Inject
ListingInteractor interactor; //here i get null interactor
MyScrollListener scrollListener;
public MainPresenterImpl(MainActivity activity) {
this.context = activity;
this.mainView = activity;
}
@Override
public void getCatFacts() {
interactor.getFacts();
}
我的交互器实现类有 API 助手,其构造函数需要上下文
public class ListingInteractorImpl implements ListingInteractor{
private Context context;
@Inject
private APIHelper; // getting null APIHelper
public ListingInteractorImpl(Context context) {
this.context = context;
}
我的组件界面是这样的:
@Component(modules={MainActivityModule.class})
@Singleton
public interface MainActivityComponent {
void inject(MainActivity mainActivity);
/*void inject(MainPresenterImpl presenter);*/
MainViewPresenter getMainPresenter();
ListingInteractor getInteractor();
ApiHelper getHelper();
}
但在 MainActivity 中只创建了 Presenter 对象,Presenter 中的所有其他对象,包括交互器、APIHelper 都是空的。根据 dagger 它应该解决所有依赖项。
【问题讨论】:
-
你是否在 Dagger 组件中注入了演示者?否则我认为它不会起作用。通常活动有一个@Inject Presenter p;并且演示者具有迭代器或您想要注入的任何东西,注入到他的构造函数中。所以演示者构造函数将是 MainPresenterImpl(activity, iterator)。如果你在模块中提供了迭代器,Dagger 就会知道要注入什么(如果很清楚,不要知道)
-
您似乎缺少有关如何使用 Dagger 及其工作原理的一些基础知识。我建议您再次阅读 Dagger 2 用户指南或其他一些教程,并确保您了解如何提供或注入依赖项
-
@Eselfar 我为组件接口添加了代码。我在组件中有演示者,它正在 MainActivity 中初始化,但是我在演示者中注入的对象没有像交互器中的交互器和 apihelper 那样被初始化
-
@DavidMedenjak 我已经添加了更多代码你能告诉我我在这里做错了什么吗,从概念上来说,模块有提供者,匕首搜索提供者来解决依赖关系。组件作为接口需要依赖的提供者和类。
标签: java android dependency-injection dagger-2