我正在使用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....
不,如果没有更多配置,这将无法工作。和AndroidInjection.inject
一样:
Application application = activity.getApplication();
if (!(application instanceof HasActivityInjector)) { /* ... */ }
给定一个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上公开)。不幸的是,实际上没有办法将多个元素绑定到ApplicationComponent的现有多边界映射中,如https://github.com/google/dagger/issues/687中所跟踪的那样,因此,这项工作至少涉及自定义AndroidInjector实现。
@ContributesAndroidInjector()
abstract fun queueActivity(): QueueActivity
哪个模块包含这部分代码?在QueueComponent中您添加了ScreenBindingModule :: class,但在另一个类中定义了注入工厂 - QueeScrennBindingModule :: classs。
这只是一个错字或它真的是两个不同的类?