如何在活动以外的任何地方注入Dagger依赖项?

时间:2018-11-21 09:04:31

标签: android kotlin dagger

我是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
}

1 个答案:

答案 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

之前被调用