Dagger 2 如何为基本 Activity 组件创建模块并为所有 MVP 组件创建单独的模块
Dagger 2 How to create a Module for Base Activity Components and a separate Module for all MVP components
您好,我是 Dagger2 的新手。
目标。以我的网络 DI 和 MVP DI 为例。 MVP 在演示者中用于扩展基础 activity 的 activity。我想将所有这些组合成一个超级模块并将其放入我的基础 activity。随着时间的推移添加更多演示者。
我不想在我的基础中有 30 多个注入语句Activity。
我正在关注 this example,但与我正在尝试做的相比,它太简单了。
我认为问题在于在基 activity 处注入 API。出于某种原因,Dagger 在我的 MVP class 中寻找 Api。那么这将是一个依赖图问题?
在这上面花了更多时间.. 问题源于 baseActivity 的 Mvp 接口或扩展 baseActivity 的任何子 activity。这意味着当它去注入时,它看到 @inject Api 调用,但找不到它。如果我将 Api 添加到此模块,它将起作用,但这与我想要的相反。我想要应用程序级项目的组件/模块。然后我想要一个组件/模块,在一个模块中包含我所有不同的 MVP 组件。这就像 Dagger 开始在树的叶子中寻找依赖项,当它看不到根中的内容时会感到不安。我需要它走另一条路。请放心,我在根 activity.
中注入了依赖项
基础Activity...
@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);
}
Api
@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)
我发现了我的问题。我需要使用一个子组件。
@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 的新手。 目标。以我的网络 DI 和 MVP DI 为例。 MVP 在演示者中用于扩展基础 activity 的 activity。我想将所有这些组合成一个超级模块并将其放入我的基础 activity。随着时间的推移添加更多演示者。
我不想在我的基础中有 30 多个注入语句Activity。 我正在关注 this example,但与我正在尝试做的相比,它太简单了。
我认为问题在于在基 activity 处注入 API。出于某种原因,Dagger 在我的 MVP class 中寻找 Api。那么这将是一个依赖图问题?
在这上面花了更多时间.. 问题源于 baseActivity 的 Mvp 接口或扩展 baseActivity 的任何子 activity。这意味着当它去注入时,它看到 @inject Api 调用,但找不到它。如果我将 Api 添加到此模块,它将起作用,但这与我想要的相反。我想要应用程序级项目的组件/模块。然后我想要一个组件/模块,在一个模块中包含我所有不同的 MVP 组件。这就像 Dagger 开始在树的叶子中寻找依赖项,当它看不到根中的内容时会感到不安。我需要它走另一条路。请放心,我在根 activity.
中注入了依赖项基础Activity...
@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);
}
Api
@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)
我发现了我的问题。我需要使用一个子组件。
@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