使用 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/