[英]Dagger 2 Android: inject the scoped activity
我正在使用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();
}
假设我有一个MyClass
类绑定到ActivityScoped,我想注入两个活动:
@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做到这一点?
@Binds注释方法将
ActivityA
和ActivityB
注入Activity。 这不起作用,因为Dagger不允许将多个实现绑定到相同的基类型。
这是正确的方法。 当您尝试将多个实现绑定到同一组件中的相同类型时,您只会收到错误。 因此,您不应该在AppComponent
绑定,而应绑定到@ActivityScoped
子组件。
您必须为每个Activity,A和B创建一个模块,将实现绑定到Activity
。 然后,您只需将该模块添加到Dagger为您创建的子组件中。
@ActivityScoped
@ContributesAndroidInjector(modules={MainActivityBindingsModule.class})
public abstract MainActivity contributeMainActivityInjector();
这样,绑定只存在于@ActivityScoped
组件中,您应该能够重复它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.