我正在使用Dagger Android链接Android应用程序中的依赖项。 我有2个活动,都有自己的范围(@ActivityScoped)。 到目前为止,这是我的代码:
public class MyApplication extends Application implements HasActivityInjector {
@Inject DispatchingAndroidInjector<Activity> activityDispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
DaggerAppComponent.builder()
.application(this)
.build()
.inject(this);
}
@Override
public AndroidInjector<Activity> activityInjector() {
return activityDispatchingAndroidInjector;
}
}
@Singleton
@Component(modules = {
AndroidInjectionModule.class,
AppModule.class,
ActivityBindingModule.class
})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application app);
AppComponent build();
}
void inject(MyApplication app);
}
@Module(subcomponents = ActivityComponent.class)
public abstract class ActivityBindingModule {
@ActivityScoped
@ContributesAndroidInjector
public abstract MainActivity contributeMainActivityInjector();
@ActivityScoped
@ContributesAndroidInjector
public abstract SecondActivity contributeSecondActivityInjector();
}
假设我有一个与ActivityScoped绑定的类MyClass
,我想将其注入到两个活动中:
@ActivityScoped
public class MyClass {
@Inject
public MyClass(Activity activity) {
// Do something with the activity instance...
}
}
我想要实现的是向封闭范围的Activity实例注入MyClass。
例如,如果将MyClass注入到ActivityA中,那么MyClass的activity
构造函数参数应该是ActivityA的一个实例。
我尝试了什么:
ActivityA
和ActivityB
注入Activity
。这不起作用,因为Dagger不允许将多个实现绑定到相同的基类型。也许我错过了一些东西,因为依赖注入很难设置。我怎么能用Dagger Android做到这一点?
答案 0 :(得分:1)
@绑定注释方法以将
ActivityA
和ActivityB
注入活动。这不起作用,因为Dagger不允许将多个实现绑定到相同的基类型。
这是正确的方法。当您尝试将多个实现绑定到同一组件中的相同类型 时,只会出现错误。因此,您不应该在AppComponent
内绑定,而应绑定到@ActivityScoped
子组件。
您必须为每个活动A和B创建一个模块,该模块将实施绑定到Activity
。然后,您只需将该模块添加到Dagger为您创建的子组件中。
@ActivityScoped
@ContributesAndroidInjector(modules={MainActivityBindingsModule.class})
public abstract MainActivity contributeMainActivityInjector();
这样绑定只存在于@ActivityScoped
组件中,您应该可以重复它。