Как внедрить зависимости Dagger где угодно, кроме Activity? - PullRequest
0 голосов
/ 21 ноября 2018

Я новичок в 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 голосов
/ 21 ноября 2018

одним из способов является внедрение конструктора

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

}

, а затем в своей деятельности вы можете внедрить его.Если кинжал способен разрешить все зависимости вашего ChildClazz, вы можете пойти

@Inject
lateinit var child: ChildClazz;

в вашем AppModule, у вас может быть что-то вроде

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

, это обеспечитВы с контекстом приложения

AndroidSupportInjection.inject(this/*activity*/) должны быть вызваны до super.onCreate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...