我是Dagger的新手,所以对我来说,有些事情仍然很难掌握。
我有一个组件:
@Singleton
@Component(
modules = [
AndroidInjectionModule::class,
AndroidSupportInjectionModule::class,
AppModule::class,
AuthModule::class
]
)
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(app: Application): Builder
@BindsInstance
fun appModule(@Named("application") app:Application): Builder
fun build(): AppComponent
}
fun inject(application: CommonApplication)
}
和一个模块:
@Module
class AppModule {
@Inject
@Named("application")
internal lateinit var application: Application
@Provides
@Singleton
fun provideApplicationContext() = application.applicationContext
@Provides
@Singleton
fun provideApplication() = application
}
在Activity中我要注入依赖项的地方
AndroidSupportInjection.inject(this/*activity*/)
这是一个问题:
只是为了理解。如果我想注入applicationContext
,则由AppModule提供给子类。例如,我有一个带有子类的MainActivity类。而且我想只向该子对象注入applicationContext,而不是将其作为参数传递。如何做到这一点?
class MainActivity {
ChildClazz child;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AndroidSupportInjection.inject(this/*activity*/)
}
}
class ChildClazz {
/* HOW TO INJECT DEPENDENCY HERE?*/
@Inject
context:Context
}
答案 0 :(得分:2)
一种方法是构造函数注入
class ChildClazz
@Inject
constructor(private val context: Context) {
}
,然后在您的活动中将其注入。如果dagger能够解决您ChildClazz
的所有依赖关系,那就很好了
@Inject
lateinit var child: ChildClazz;
在您的AppModule
中,您可能会喜欢
@Provides
fun provideContext(app: Application): Context = app.applicationContext
这将为您提供应用程序上下文
AndroidSupportInjection.inject(this/*activity*/)
必须在super.onCreate