android - 具有多个接口(interface)实现的 Dagger Hilt

标签 android dependency-injection dagger-2 dagger-hilt

使用 Dagger2 可以很容易地显式创建组件并列出它们的依赖项。但我似乎无法找到一种方法来提供接口(interface)的不同实现来让我们说一个 fragment 。
例如,我的应用有 2 种生产模式:付费和免费。
我有一个 PaidActivity 和一个 FreeActivity,它们都使用 Analytics 类开始完全相同的仪表板 fragment 。对于付费,我提供了一个 PaidAnalytics 实现,对于免费,我提供了一个 FreeAnalytics 实现。
使用 Dagger2,只需在 Activity 的组件(或子组件)中列出付费或免费模块即可轻松实现。

@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

    ...

}

有了 Dagger Hilt,我找不到办法做到这一点。

最佳答案

在我的用例中,使用 Dagger 在运行时替换依赖项是不可能的。
在其中一个 Google Hilt session 期间,他们建议在 Provides 方法中使用 if else 语句:https://youtu.be/i27aNF-kYR4?t=3355 (这是我宁愿避免的)。
上面的答案不理解我的问题,因为它们在编译时是限定依赖项,而我做不到。因为我的 fragment 永远不知道它被使用的地方,我不想只是复制代码。
这是一个示例,您可以准确地看到我在做什么,而 Hilt 无法通过设计实现它:https://github.com/dmytroKarataiev/daggerAndroidvsHiltRuntimeDependencies

关于android - 具有多个接口(interface)实现的 Dagger Hilt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68367053/

相关文章:

java - Dagger-2 的空指针异常(android)

android - 使用 RxAndroid 用例在 Presenter 中测试什么以及如何测试

android - "context"到底是什么意思?对于 soundPool.load int load(Context context, int resId, int priority)

java - 在 Java 中使用 Jackson JSON 库解析 ASP.NET MVC 返回日期

php - Symfony 3.3 服务自动配置

c# - 静态依赖注入(inject)工厂,对还是错?

android - 如何使用 Hilt 在存储库中注入(inject)应用程序上下文?

java - 通过 Dagger 将 Presenter 注入(inject) Activity

android - 使用 make 编译 android 系统应用

android - 从我的项目中获取 APK 文件