Dagger 2.10+: Внедрить зависимость с контекстом действия в Деятельности и Фрагментах - PullRequest
1 голос
/ 23 апреля 2019

У меня есть класс с именем AlertManager, для которого требуется Activity экземпляр, чтобы показать Toast и AlertDialog.

class AlertManager @Inject constructor(private val activity: Activity) {

    fun showToast(message: String) {
        Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()
    }
}

Теперь я хочу AlertManager как зависимость в двух действиях HomeActivity & ProductsActivity.В настоящее время я создал модули для каждого Activity, например:

@Module
class HomeActivityModule {
    @Provides
    @ActivityContext
    fun provideAlertManager(activity: HomeActivity) = AlertManager(activity)
}

И

@Module
class ProductsActivityModule {
    @Provides
    @ActivityContext
    fun provideAlertManager(activity: ProductsActivity) = AlertManager(activity)
}

И связал их с Dagger, как

@Module
abstract class ActivityProvider {
    @ContributesAndroidInjector(modules = [HomeActivityModule::class])
    @ActivityContext
    abstract fun bindHomeActivity(): HomeActivity

    @ContributesAndroidInjector(modules = [ProductsActivityModule::class])
    @ActivityContext
    abstract fun bindProductsActivity(): ProductsActivity
}

Теперь мои вопросы:

1) Как мне избежать создания модулей для каждого вида деятельности и иметь общие ActivityModule, которые я могу связать с любым Activity я хочу?

2) Допустим, у меня есть фрагмент с именем HomeFragment внутри HomeActivity, тогда как я могу внедрить тот же AlertManager экземпляр HomeActivity внутри фрагмента?

Я застрял здесьс тех пор довольно долго и пытался найти много через Интернет, но я не могу найти ни одного блога или руководства, которые могут помочь мне достичь того, что я ищу.Если кто-то может указать мне правильное направление, я буду благодарен.

1 Ответ

2 голосов
/ 23 апреля 2019

1) Как мне избежать создания модулей для каждого действия и иметь общий ActivityModule, который я могу связать с любым действием, которое я хочу?

Вы можете иметь какой-то AlertManagerModule, куда вы добавляете родовое действие.

@Provides
fun provideAlertManager(activity: Activity) = AlertManager(activity)

Вам все равно придется создавать отдельные модули активности.Одно из изменений, которое вы можете сделать:

@Module
abstract class HomeActivityModule {
    @Binds
    abstract fun providesActivity(activity: HomeActivity) : Activity
}

И затем вы можете добавить их в класс ActivityProvider:

@Module
abstract class ActivityProvider {
    @ContributesAndroidInjector(modules = [HomeActivityModule::class, AlertManagerModule::class])
    abstract fun bindHomeActivity(): HomeActivity

    @ContributesAndroidInjector(modules = [ProductsActivityModule::class, AlertManagerModule::class])
    abstract fun bindProductsActivity(): ProductsActivity
}

2) Допустим, у меня есть фрагмент с именем HomeFragment внутриТогда HomeActivity, как я могу внедрить тот же экземпляр AlertManager HomeActivity внутри фрагмента?

Поскольку вы используете DaggerActivity и, скорее всего, используете DaggerFragment ,фрагмент, созданный в HomeFragment , может напрямую получить AlertManager, просто используя аннотацию @Inject во фрагменте, если вы добавите в HomeActivityModule :

 @Module
 abstract class HomeActivityModule {

    @Binds
    abstract fun providesActivity(activity: HomeActivity) : Activity

    @FragmentScope
    @ContributesAndroidInjector
    abstract fun providesHomeFragment() : HomeFragment;
}
...