在Dagger 2 Android中,我真的很喜欢新的简化API,但我现在需要一点点自定义,这让我头疼。
我有一个非常常见的场景:一个带有一些活动的应用程序,并注入了每个依赖项。
我将首先描述我当前的实现,然后是问题。拜托我一秒钟,拜托。
我首先创建了常规ActivitiesModule
@Module
abstract class ActivitiesModule {
@PerActivity
@ContributesAndroidInjector(modules = MainActivityModule.class)
abstract MainActivity bindMainActivity();
// More activities here, all with the scope @PerActivity
}
然后我的MainActivityModule.java
(和所有其他活动模块)看起来像这样
@Module
public abstract class MainActivityModule {
@Binds
@ActivityContext
@PerActivity
abstract Context provideActivityContext(MainActivity mainActivity);
@Binds
@PerActivity
abstract Activity provideActivity(MainActivity mainActivity);
@Binds
@PerActivity
abstract MainMvpView provideView(MainActivity mainActivity);
}
这很完美,因为每次我需要一个类中的活动或上下文时,我都可以这样做,而不会将我的对象与特定活动紧密耦合。
@PerActivity
public class MainPresenter {
private final MainMvpView view;
@Inject
MainPresenter(MainMvpView view) {
this.view = view;
}
}
这很好,因为如果我不需要,我不需要声明@Subcomponent
。 然而,现在我想在我的MainActivity
子组件中注入自定义视图,并且我遇到了回到旧dagger.android
方式的问题。
到目前为止,我用旧的方式替换ContributesAndroidInjector
,就像这样
@Binds
@IntoMap
@ActivityKey(MainActivity.class)
abstract AndroidInjector.Factory<? extends Activity>
bindMainActivityInjectorFactory(MainActivitySubcomponent.Builder builder);
我创建了一个新的MainActivitySubcomponent
,看起来像这样
@PerActivity
@Subcomponent
public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
}
该模块几乎保持不变。问题是我收到很多错误,表示Activity
和Context
被绑定多次。
所以我的两个问题是:
@Binds
Activity
Context
和dagger.android
,如果它们是作用域的,那么我是否可以保持完全解耦?,
中的最新内容进行查看注入?任何建议都将不胜感激。