我正在使用Dagger2
,我想知道是否可以对相关组件使用新的Android Injector
吗?我看过一些使用子组件的教程,而基本的App组件只会注入所有内容。
AppComponent
@Singleton
@Component(modules = [AndroidSupportInjectionModule::class])
interface ApplicationComponent {
fun inject(app: App)
@Component.Builder
interface Builder {
fun build(): ApplicationComponent
@BindsInstance
fun app(app: Context): Builder
}
}
QueueComponent
@QueueScope
@Component(dependencies = arrayOf(ApplicationComponent::class), modules = [ScreenBindingModule::class])
interface QueueComponent {
}
ScreenBindingModule
@Module
abstract class ScreenBindingModule {
@ContributesAndroidInjector()
abstract fun queueActivity(): QueueActivity
}
在onCreate
中,我添加了AndroidInjection.inject(this)
,但问题是该应用程序崩溃,但异常:
Caused by: java.lang.IllegalArgumentException: No injector factory bound for Class....
答案 0 :(得分:1)
否,如果没有更多配置,则无法使用。与AndroidInjection.inject
中一样:
Application application = activity.getApplication();
if (!(application instanceof HasActivityInjector)) { /* ... */ }
给出一个Activity,没有简单的方法来确定应该使用哪个比Activity范围宽的对象来创建Activity的子组件,因此dagger.android尝试将Application转换为HasActivityInjector类型。您的应用程序显然暴露了HasActivityInjector来获取该错误消息(很可能是通过在清单中标记DaggerApplication或DaggerApplication的自定义子类来实现的),但是该实现仅returns the DispatchingAndroidInjector<Activity>
就是searches a multibindings map。
尽管@ContributesAndroidInjector
自动安装到该映射中,但是每个组件(ApplicationComponent和QueueComponent)都包含一个不同的映射,而DaggerApplication仅在ApplicationComponent中查询该映射。
为了使它与组件相关性一起工作,您需要让您的Application子类的activityInjector
方法返回一个不同的AndroidInjector实现,该实现创建/获取QueueComponent实例并读取多边界Maps(必须是在QueueComponent上公开)。不幸的是,https://github.com/google/dagger/issues/687中所跟踪的,实际上并没有一种方法可以将多个元素绑定到您的ApplicationComponent的现有多边界映射中,因此,至少要使用自定义AndroidInjector实现来进行这项工作。
答案 1 :(得分:0)
@ContributesAndroidInjector()
abstract fun queueActivity(): QueueActivity
哪个模块包含这部分代码?在QueueComponent中,添加了ScreenBindingModule :: class,但在另一个类QueeScrennBindingModule :: classs中定义了注入器工厂。
这只是一个错字,或者实际上是两个不同的类?