Dagger 2 如何使用雄激素注射器。工厂?

Dagger 2 如何使用雄激素注射器。工厂?,dagger-2,dagger,Dagger 2,Dagger,我正在从Dagger 2.21迁移,构建器更改为Factory。雄激素注射器工厂应该如何使用?我有这个组件 interface AppComponent : AndroidInjector<MainApplication> { @Component.Factory interface Factory : AndroidInjector.Factory<MainApplication> { fun create(@BindsInstanc

我正在从Dagger 2.21迁移,构建器更改为Factory。雄激素注射器工厂应该如何使用?我有这个组件

interface AppComponent : AndroidInjector<MainApplication> {

    @Component.Factory
    interface Factory : AndroidInjector.Factory<MainApplication> {

        fun create(@BindsInstance emailId: String) : AppComponent
    }
}
接口AppComponent:AndroidJector{
@组件工厂
接口工厂:AndroidJector.Factory{
趣味创建(@BindsInstance emailId:String):AppComponent
}
}
但是它失败了,“error:@Component.Factory类型必须只有一个抽象方法。已找到:create(T)”

工厂似乎已经有了一个绑定MainApplication实例的create。我应该如何绑定另一个值?我发现唯一的解决办法不是从AndroidJector.Factory这样扩展,但是为什么要有AndroidJector.Factory呢

interface AppComponent : AndroidInjector<MainApplication> {

    @Component.Factory
    interface Factory {

        fun create(@BindsInstance instance: MainApplication,
                   @BindsInstance emailId: String) : AppComponent
    }
}
接口AppComponent:AndroidJector{
@组件工厂
接口工厂{
趣味创建(@BindsInstance实例:main应用程序,
@BindsInstance emailId:String):AppComponent
}
}
当您有创建组件所需的其他参数时,您不需要(而且正如您所注意到的,您实际上不需要)扩展
Androidjector.Factory

当您使用dagger android使用
AndroidInjection.inject()
将依赖项注入android组件时,应该扩展
AndroidInjector.Factory
。为了使这种注入成为可能,您需要遵循以下步骤,尤其是组件的工厂应该扩展
androidjector.factory

androidjector.Factory
定义了
androidjector创建(@BindsInstance T instance)
,dagger android将使用它来实例化此子组件,因此您无法添加任何其他参数

更新

Dagger和Dagger android是两个不同的库。Dagger是一个通用的DI框架,它不包含任何特定于android的代码
Component.Factory
来自dagger本身,您可以自由添加带有任意数量参数的方法,这些参数将用于创建子组件

Dagger android是一个特定于android的库,它通过生成模板代码大大减少了您需要编写的模板代码。但是您失去了一些灵活性,必须遵循库定义的结构。这里您的工厂方法不能有任何附加参数,工厂应该扩展
androidjector.factory


通常,您也可以在一个项目中混合使用这两种方法,但我不建议这样做以使代码一致

到目前为止,ContributesAndroidInjector为子组件工作。在内部,我猜它仍然使用Subcomponent.Factory。仍然想知道如果需要在子组件级别@BindsInstance来利用作用域(如果支持的话)
ContributesAndroidInjector
只为您生成代码,是的,此代码包含
subcomponent.Factory
,它扩展了
AndroidInjector.Factory
。您可以自由使用
@BindsInstance
,但这将失去代码生成的便利,并且必须自己实例化子组件,就像您通常不用dagger-android一样。dagger显然无法为您的
子组件.Factory
提供任何附加参数,因此如果您需要它们,只需手动创建子组件。在这种情况下,不要扩展AndroidJector.Factory。