如何使用AndroidInjector.Factory?

How to use AndroidInjector.Factory?

我正在从 Dagger 2.21 迁移,Builder 已更改为 Factory。 AndroidInjector.Factory 应该如何使用?我有这个组件

interface AppComponent : AndroidInjector<MainApplication> {

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

        fun create(@BindsInstance emailId: String) : AppComponent
    }
}

但是它失败了"error: @Component.Factory types must have exactly one abstract method. Already found: create(T)"。

AndroidInjector.Factory 似乎已经有一个绑定 MainApplication 实例的创建。我应该如何绑定另一个值?我发现的唯一解决方法是不要像这样从 AndroidInjector.Factory 扩展,但为什么要 AndroidInjectory.Factory?

interface AppComponent : AndroidInjector<MainApplication> {

    @Component.Factory
    interface Factory {

        fun create(@BindsInstance instance: MainApplication,
                   @BindsInstance emailId: String) : AppComponent
    }
}

当您需要额外的参数来创建组件时,您不需要(正如您注意到的那样实际上不能)扩展 AndroidInjector.Factory

当您使用 dagger-android 将依赖项注入到使用 AndroidInjection.inject() 的 android 组件时,您应该扩展 AndroidInjector.Factory。为了使这种注入成为可能,您需要遵循 some rules,特别是您的组件工厂应该扩展 AndroidInjector.Factory

AndroidInjector.Factory定义了AndroidInjector<T> create(@BindsInstance T instance),dagger-android会使用它来实例化这个子组件,所以不能添加任何额外的参数。

更新:

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

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

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