Dagger 2如何为基本活动组件创建模块,并为所有MVP组件创建单独的模块

时间:2017-02-16 00:53:38

标签: android dagger-2 android-mvp

您好我是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)

1 个答案:

答案 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?