Dagger Hilt 具有接口的多个实现

Dmy*_*iev 11 android dependency-injection dagger-2 dagger-hilt

使用 Dagger2 可以轻松显式创建组件并列出它们的依赖项。但我似乎找不到一种方法来提供接口的不同实现,比如片段。

例如,我的应用程序有 2 种生产模式:付费和免费。我有一个 PaidActivity 和一个 FreeActivity,它们都使用 Analytics 类启动完全相同的仪表板片段。对于付费,我提供 PaidAnalytics 实现,对于免费,我提供 FreeAnalytics 实现。

使用 Dagger2,只需在活动的组件(或子组件)中列出付费或免费模块即可轻松实现。

@Module
abstract class FreeActivityModule {

    @ContributesAndroidInjector(
        modules = [
            FreeAnalyticsModule::class,
            DashboardFragmentModule::class
        ]
    )
    abstract fun injectFreeActivity(): FreeActivity

}

@Module
abstract class PaidActivityModule {

    @ContributesAndroidInjector(
        modules = [
            PaidAnalyticsModule::class,
            DashboardFragmentModule::class
        ]
    )
    abstract fun injectPaidActivity(): PaidActivity

}

@Module
abstract class DashboardFragmentModule {

    @ContributesAndroidInjector
    abstract fun injectDashboardFragment(): DashboardFragment

}

class DashboardFragment : Fragment() {

    ...

    @Inject
    lateinit var analytics: Analytics

    ...

}

Run Code Online (Sandbox Code Playgroud)

对于 Dagger Hilt,我找不到办法做到这一点。

Dmy*_*iev 7

在我的用例中,使用 Dagger 不可能在运行时替换依赖项。

在一次 Google Hilt 会议期间,他们建议在 Provides 方法中使用 if else 语句:https://youtu.be/i27aNF-kYR4? t=3355(这是我更愿意避免的)。

上面的答案不理解我的问题,因为它们在编译时限定依赖项,这是我无法做到的。因为我的片段永远不知道它的使用位置,所以我不想只是重复代码。

这是一个示例,您可以在其中准确地看到我正在做的事情,并且它无法通过设计来实现 Hilt: https: //github.com/dmytroKarataiev/daggerAndroidvsHiltRuntimeDependencies