没有开往 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
来生成扩展 Activities
、Fragments
、Services
、[=22 的 类 =]等
所以 ActivityModule hold the
@ContributesAndroidInjector`:
@Singleton
@ContributesAndroidInjector(modules = [FragmentModule::class])
abstract fun contributeMainactivity(): MainActivity
而现在的 Dagger
知道您可以神奇地向 MainActivity
注入依赖项。
同样适用于其中的 FragmentModule
。
而且在你的 MainActivity
中你可以做到:
AndroidInjection.inject(this)
并注入你的依赖。
就是这样。你可以查看我关于 Dagger-Android here 的个人文章。
我在堆栈中看到了同样的问题,但他们试图用 @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
来生成扩展 Activities
、Fragments
、Services
、[=22 的 类 =]等
所以 ActivityModule hold the
@ContributesAndroidInjector`:
@Singleton
@ContributesAndroidInjector(modules = [FragmentModule::class])
abstract fun contributeMainactivity(): MainActivity
而现在的 Dagger
知道您可以神奇地向 MainActivity
注入依赖项。
同样适用于其中的 FragmentModule
。
而且在你的 MainActivity
中你可以做到:
AndroidInjection.inject(this)
并注入你的依赖。
就是这样。你可以查看我关于 Dagger-Android here 的个人文章。