如何使用 AndroidInjector.Factory?

Vai*_*van 4 dagger dagger-2

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

interface AppComponent : AndroidInjector<MainApplication> {

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

        fun create(@BindsInstance emailId: String) : AppComponent
    }
}
Run Code Online (Sandbox Code Playgroud)

但它失败了“错误:@Component.Factory 类型必须只有一个抽象方法。已经找到: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
    }
}
Run Code Online (Sandbox Code Playgroud)

ese*_*sov 6

AndroidInjector.Factory当您有创建组件所需的附加参数时,您不需要(并且您注意到您实际上不能)扩展。

AndroidInjector.Factory当您使用 dagger-android 将依赖项注入 android 组件时,您应该使用AndroidInjection.inject(). 为了使这种注入成为可能,您需要遵循一些规则,特别是您的组件工厂应该扩展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.

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