没有开往 Class<> 的喷油器工厂

No injector factory bound for Class<>

我在堆栈中看到了同样的问题,但他们试图用 @ContributesAndroidInjector 修复错误,但在 Dagger 文档中说使用 @ContributesAndroidInjector 只是可选的,所以这是我的 类:

我的MainActivityComponent:

@Subcomponent(modules = [
    MainBuilder::class
])
@ActivityScope
interface MainComponent: AndroidInjector<MainActivity>{

    @Subcomponent.Factory
    interface Factory: AndroidInjector.Factory<MainActivity>
}

我的AplicationBinder:

@Module(subcomponents = [
    MainComponent::class
])
abstract class AppBuilder {

    @Binds
    @IntoMap
    @ClassKey(MainActivity::class)
    abstract fun mainActivityFactoryBind(factory: MainComponent.Factory): AndroidInjector.Factory<out Activity>

}

我的 BaseActivity 扩展了我的 MainActivity:

abstract class BaseActivity: HasSupportFragmentInjector, AppCompatActivity() {

    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Fragment>

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment> {
        return dispatchingAndroidInjector
    }
}

我该如何解决这个问题?

实际上匕首文档说:

Pro-tip: If your subcomponent and its factory have no other methods or supertypes other than the ones mentioned in step #2, you can use @ContributesAndroidInjector to generate them for you. Instead of steps 2 and 3, add an abstract module method that returns your activity, annotate it with @ContributesAndroidInjector, and specify the modules you want to install into the subcomponent. If the subcomponent needs scopes, apply the scope annotations to the method as well.

所以基本上 @ContributesAndroidInjector 将生成您手动执行的子组件。由于您的案例与此步骤的 Daggers 文档相匹配,因此您可以自由使用 @ContributesAndroidInjector

示例:

@Singleton
@Component(
    modules = [AndroidInjectionModule::class, ActivityModule::class, BroadCastReceiversModule::class,...]
)
interface AppComponent {
    fun inject(pocketTreasureApplication: MyApplication)

    @Component.Factory
    interface Factory {
        fun create(@BindsInstance application: Application): AppComponent
    }
}

AndroidInjectionModule 没有 Dagger。在那种情况下,它会告诉 Dagger:嘿,我们有 Android 个组件要处理,而且 Dagger 知道如何生成它们。

然后,您应该使用您的模块,例如 ActivityModule 来生成扩展 ActivitiesFragmentsServices、[=22 的 类 =]等

所以 ActivityModule hold the@ContributesAndroidInjector`:

    @Singleton
    @ContributesAndroidInjector(modules = [FragmentModule::class])
    abstract fun contributeMainactivity(): MainActivity

而现在的 Dagger 知道您可以神奇地向 MainActivity 注入依赖项。 同样适用于其中的 FragmentModule

而且在你的 MainActivity 中你可以做到:

AndroidInjection.inject(this) 并注入你的依赖。

就是这样。你可以查看我关于 Dagger-Android here 的个人文章。