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

How to inject Dagger dependendcies anywhere, except Activity?

我是 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*/)

这里有一个问题:

仅供理解。如果我想将 AppModule 提供的 applicationContext 注入 child class。例如,我有一个 class MainActivity 和 child class。我只想将 applicationContext 注入到此 child, 而不是将其作为参数传递。 如何做到这一点?

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
}

一种方法是构造函数注入

class ChildClazz
@Inject
constructor(private val context: Context) {

}

然后,在您的 activity 中,您可以注入它。如果 dagger 能够解决你 ChildClazz 的所有依赖关系,你就可以开始了

@Inject
lateinit var child: ChildClazz;

在你的 AppModule 中你可以有类似

的东西
@Provides
fun provideContext(app: Application): Context = app.applicationContext

这将为您提供应用程序上下文

AndroidSupportInjection.inject(this/*activity*/) 必须在 super.onCreate

之前调用