Dagger-Android @ActivityKey 未找到,如何显式创建子组件
Dagger-Android @ActivityKey not found, how to create Sub components explicitly
在 dagger 2.25.2 中找不到 import dagger.android.ActivityKey
所以我无法显式添加子组件,而不是使用 @ContributesInjector
,使用 ApplicationModule
@Module(subcomponents = [MainActivitySubComponent::class], includes = [DummyDependencyModule::class])
abstract class AppModule {
@Binds
abstract fun bindContext(application: Application): Context
@Binds
@IntoMap
@ActivityKey(MainActivity::class)
abstract fun bindInjectorFactory(builder: MainActivitySubComponent.Builder)
: AndroidInjector.Factory<out Activity>
@Module
companion object DummyDependencyModule {
@Provides
fun provideDummyDependency(context: Context): DummyDependency {
return DummyDependency(context)
}
}
}
应用程序组件是
@Component(modules = [AndroidSupportInjectionModule::class, AppModule::class])
interface AppComponent : AndroidInjector<DaggerApplication> {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
MainActivity子组件是
@Subcomponent
interface MainActivitySubComponent : AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder : AndroidInjector.Builder<MainActivity>()
}
我 创建了 一个 ActivityKey 因为它无法从 Dagger 库中找到
有错误
error: cannot find symbol,
@ActivityKey(MainActivity.class)
^ symbol: class ActivityKey location: class ApplicationModule
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
internal annotation class ActivityKey(val value: KClass<out Activity>)
错误是
IllegalArgumentException: No injector factory bound for Class<cMainActivity>
检查生成的代码后,我发现它现在在 AppModule
中用作 @ClassKey
@ClassKey(MainActivity::class)
abstract fun bindInjectorFactory(builder: MainActivitySubComponent.Builder)
: AndroidInjector.Factory<*>
而不是
@Binds
@IntoMap
@ActivityKey(MainActivity::class)
abstract fun bindInjectorFactory(builder: MainActivitySubComponent.Builder)
: AndroidInjector.Factory<out Activity>
ClassKey 代码是
@Documented
@Target(METHOD)
@Retention(RUNTIME)
@MapKey
public @interface ClassKey {
Class<?> value();
}
在 dagger 2.25.2 中找不到 import dagger.android.ActivityKey
所以我无法显式添加子组件,而不是使用 @ContributesInjector
,使用 ApplicationModule
@Module(subcomponents = [MainActivitySubComponent::class], includes = [DummyDependencyModule::class])
abstract class AppModule {
@Binds
abstract fun bindContext(application: Application): Context
@Binds
@IntoMap
@ActivityKey(MainActivity::class)
abstract fun bindInjectorFactory(builder: MainActivitySubComponent.Builder)
: AndroidInjector.Factory<out Activity>
@Module
companion object DummyDependencyModule {
@Provides
fun provideDummyDependency(context: Context): DummyDependency {
return DummyDependency(context)
}
}
}
应用程序组件是
@Component(modules = [AndroidSupportInjectionModule::class, AppModule::class])
interface AppComponent : AndroidInjector<DaggerApplication> {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
MainActivity子组件是
@Subcomponent
interface MainActivitySubComponent : AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder : AndroidInjector.Builder<MainActivity>()
}
我 创建了 一个 ActivityKey 因为它无法从 Dagger 库中找到
有错误
error: cannot find symbol, @ActivityKey(MainActivity.class) ^ symbol: class ActivityKey location: class ApplicationModule
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
internal annotation class ActivityKey(val value: KClass<out Activity>)
错误是
IllegalArgumentException: No injector factory bound for Class<cMainActivity>
检查生成的代码后,我发现它现在在 AppModule
中用作@ClassKey
@ClassKey(MainActivity::class)
abstract fun bindInjectorFactory(builder: MainActivitySubComponent.Builder)
: AndroidInjector.Factory<*>
而不是
@Binds
@IntoMap
@ActivityKey(MainActivity::class)
abstract fun bindInjectorFactory(builder: MainActivitySubComponent.Builder)
: AndroidInjector.Factory<out Activity>
ClassKey 代码是
@Documented
@Target(METHOD)
@Retention(RUNTIME)
@MapKey
public @interface ClassKey {
Class<?> value();
}