您好我是Dagger2的新手。 目标。拿我的网络DI和MVP DI。 MVP与演示者一样,用于扩展基本活动的活动。我想将所有这些组合成一个超级模块并将其放入我的基本活动中。随着时间的推移,添加更多的演示者。
我的baseActivity中不需要30+注入语句。 我正在关注this example,但与我想要做的相比,它太简单了。
我认为问题在于在基础活动中注入API。出于某种原因,Dagger在我的MVP课程中寻找Api。那么这将是一个依赖图问题?
花了更多的时间在这上面..问题源于Mvp的baseActivity接口或任何扩展baseActivity的子活动。这意味着当它进入注入时,它会看到@inject Api调用,但无法找到它。如果我将Api添加到此模块中,它将起作用,但这会颠倒我想要的内容。我想要应用程序级项目的组件/模块。然后我想要一个组件/模块,它在一个模块中包含我所有不同的MVP组件。就像Dagger开始在树的叶子中寻找依赖关系并且在它看不到root中的什么时会感到不安。我需要它走另一条路。请注意我在Root活动中注入了依赖项。
基础活动......
@inject
public ApiClient mClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mManager = new SharedPreferencesManager(this);
DaggerInjector.get().inject(this);
}
DaggerInjector
public class DaggerInjector {
private static AppComponent appComponent = DaggerAppComponent.builder().appModule(new AppModule()).build();
public static AppComponent get() {
return appComponent;
}
}
@Component(modules = {AppModule.class, ApiModule.class, MvpModule.class})
@Singleton
public interface AppComponent {
void inject(BaseActivity activity);
}
阿比
@Singleton
@Component(modules = {ApiModule.class})
public interface ApiComponent {
void inject( BaseActivity activity);
}
@Module
public class ApiModule {
@Provides
@Singleton
public ApiClient getApiClient(){
return new ApiClient();
}
}
MVP
@Singleton
@Component(modules = {MvpModule.class})
public interface MvpComponent {
void inject(BaseActivity activity);
}
@Module
public class MvpModule {
@Provides
@Singleton
public MvpPresenter getMvpPresenter(){ return new MvpPresenter();}
}
Error:(16, 10) error: ApiClient cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method. This type supports members injection but cannot be implicitly provided.
ApiClient is injected at
...BaseActivity.ApiClient
...BaseActivity is injected at
MvpComponent.inject(activity)
答案 0 :(得分:0)
我发现了我的问题。我需要使用一个子组件。
@Singleton
@Subcomponent(modules = {MvpModule.class})
public interface MvpComponent {
void inject(BaseActivity activity);
}
@Module
public class MvpModule {
@Provides
@Singleton
public MvpPresenter getMvpPresenter(){ return new MvpPresenter();}
}
见
Dagger- Should we create each component and module for each Activity/ Fragment
Dagger2 activity scope, how many modules/components do i need?