如何使用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
。
通常您也可以在一个项目中混合使用这两种方法,但我不建议这样做以使您的代码保持一致。
我正在从 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
。
通常您也可以在一个项目中混合使用这两种方法,但我不建议这样做以使您的代码保持一致。