我有一个应用程序,其中包含通过匕首2注入的带有依赖项的活动和片段 我能够在活动和片段中进行字段注入,但不能在其他类中进行构造函数注入。 这是我的相关代码
@Module
public abstract class MainFragmentProvider {
@ContributesAndroidInjector(modules = HomeFragmentModule.class)
abstract HomeFragment provideHomeFragmentFactory();
}
和
@Module
public class HomeFragmentModule {
...
@Provides
static HomePresenter provideHomePresenter(HomeView homeView, HomeInteractor homeInteractor) {
return new HomePresenter(homeView, homeInteractor);
}
如何编写代码,以便可以通过构造函数注入直接在HomePresenter中获得依赖关系,而不是在模块中编写ProvideMethods。之所以这样做,是因为在这种情况下,每次我想更改构造函数参数时,都需要更改模块代码。
如何在HomePresenter的构造函数中做类似的事情?
@Inject
public HomePresenter(HomeView homeView, HomeInteractor homeInteractor) {
this.homeInteractor = homeInteractor;
this.homeView = homeView;
}
答案 0 :(得分:0)
要注入构造函数,Dagger必须知道在哪里获取传递给它的参数,即
你必须提供
HomeView homeView, HomeInteractor homeInteractor
因此,还要创建用于提供其他依赖项的方法:
@Provides
static HomeView provideHomeView() {
return ...
}
@Provides
static HomeInteractor provideHomeInteractor() {
return ...
}
答案 1 :(得分:0)
我对dagger 2的android扩展了解不多,但据我所知,有两种方法可以实现您所寻找的结果。
在相关组件中,您可以根据自己的类型指定方法:
interface SomeComponent {
HomePresenter presenter(); // Method name does not matter here, only the type
}
并像这样访问它
class Home {
HomePresenter presenter;
void initialize() { //This could be your onCreate or wherever you typically inject
presenter = getSomeComponent().presenter();
}
}
,或者如果您为Home对象指定了注入方法,则可以请求它:
interface SomeComponent {
void inject(Home home);
}
class Home {
@Inject HomePresenter presenter;
void initialize(){
getSomeComponent().inject(this);
}
}
在两种情况下,您都必须确保Component
包含适当的Module
。