匕首注入相关组件

时间:2019-02-13 10:33:49

标签: android dagger-2

我正在使用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....

2 个答案:

答案 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中定义了注入器工厂。

这只是一个错字,或者实际上是两个不同的类?