Android 无专用子组件的片段注入

Android 无专用子组件的片段注入,android,dagger-2,dagger,Android,Dagger 2,Dagger,我试图使用android dagger从手动定义的子组件中注入一个片段: @Component(modules = [ AndroidSupportInjectionModule::class, AppModule::class, BuilderModule::class ]) interface AppComponent : AndroidInjector<App> { @Component.Builder abstract class B

我试图使用android dagger从手动定义的子组件中注入一个片段:

@Component(modules = [
    AndroidSupportInjectionModule::class,
    AppModule::class,
    BuilderModule::class
])
interface AppComponent : AndroidInjector<App> {

    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<App>()

    fun someComponent(): SomeComponent

}

执行失败,原因是:

IllegalArgumentException:类“SomeFragment”没有注入器工厂绑定


但是,如果我创建了一个带有
@ContributesAndroidInjector
注释的片段绑定,它的执行效果很好。文档声明,所有这些操作都是创建一个子组件。为什么我不能手动操作


在github上可以找到最小的工作项目:
@ContributesAndroidInjector
创建子组件,是。不要再说了,但他们不会断言这只会创建一个子组件;它还将其安装到为dagger.android的每种注入类型提供动力的
地图中

您可以在上看到此映射绑定的示例:



编辑:现在我突然想到,您的标题说明您不需要专用子组件;除了使用手动定义而不是
@ContributesAndroidInjector
,如果您想要一个多片段子组件,那么您可能会遇到一些问题,因为这个建议:dagger.android需要实现
AndroidInjector
,并且由于擦除,您不能让一个类实现多个
androidjector
androidjector.Builder
接口或抽象类。在这些情况下,您可能需要编写一个手动的Androidjector.Factory实现,该实现调用正确的concrete
inject
方法。然而,在最佳实践要求dagger的情况下,为了创建单片碎片组件,这似乎需要做很多工作。android的默认设置是:每个碎片都有一个小而具体的组件。

感谢您的编辑。回答了我的问题,虽然不是以我希望的方式。
@Subcomponent
interface SomeComponent {

    fun inject(fragment: SomeFragment)

}
@Binds
@IntoMap
@FragmentKey(YourFragment.class)
abstract AndroidInjector.Factory<? extends Fragment>
    bindYourFragmentInjectorFactory(YourFragmentSubcomponent.Builder builder);
/** No need for an explicit inject, because you must extend AndroidInjector. */
@Subcomponent
interface SomeComponent extends AndroidInjector<SomeFragment> {

  /**
   * This abstract class handles the final create(Fragment) method,
   * plus @BindsInstance.
   */
  @Subcomponent.Builder
  abstract class Builder extends AndroidInjector.Builder<SomeFragment> {}
}