我从 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)
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.
通常,您也可以在一个项目中混合使用这两种方法,但我不建议这样做以使您的代码一致。
| 归档时间: |
|
| 查看次数: |
1666 次 |
| 最近记录: |