【问题标题】:bind interface by different concrete class in hilt?通过不同的具体类绑定接口?
【发布时间】:2020-12-26 16:00:34
【问题描述】:

我使用 Hilt 。 我有一个接口,但我有两个实现了它们的类。 我需要在 ViewModels 中实现不同的 @Bind 接口。 请帮帮我? 创建自定义组件?还是使用自定义范围?

【问题讨论】:

    标签: android dagger dagger-hilt


    【解决方案1】:

    您提供的给定代码会有所帮助,但让我们假设:

    您的界面

    interface YourInterface {}
    

    class MyFirstClassImpl @Inject constructor() : YourInterface
    
    class MySecondClassImpl @Inject constructor() : YourInterface
    

    Di 模块

    @Module
    @InstallIn(SingletonComponent::class)
    inteface YourClassModule {
        @Binds
        @MyFirstClass
        fun provideMyFirstClass(class: MyFirstClassImpl): YourInterface
    
        @Binds
        @MySecondClass
        fun provideMySecondClass(class: MySecondClassImpl): YourInterface
    
    }
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class MyFirstClass
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class MySecondClass
    

    视图模型

    class YourViewModel @ViewModelInject constructor(
        @MyFirstClass private val firstClass: YourInterface,
        @MySecondClass private val secondClass: YourInterface
    ) : ViewModel()
    

    这应该可以完成工作。

    【讨论】:

    • @MyFirstClass@MySecondClass注解需要什么?它只是为了可读性吗?
    • 不,不是。因为,MyFirstClass 和 MySecondClass 提供了相同的接口,你必须告诉 hilt,如何区分它们。如果没有@MyFirstClass@MySecondClass,hilt 将不知道何时提供哪个类。
    • @Andrew,你如何使用Binds,当一个Activity实现了接口并收到回调后,你想在Activity中做一些业务逻辑?请帮忙!
    • @Rakesh 你不能。 Activity 必须继承接口回调,然后在回调中做一些事情。
    • @Andrew,您能否提供一个示例以便更好地理解?
    猜你喜欢
    • 2018-03-14
    • 2019-01-05
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多