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