android - Dagger 2 注入多个接口和实现类

Tes*_*Ktl 5 android module interface kotlin dagger-2

所以我想构建多模块化android项目,但在注入接口和实现方面遇到问题。

我有两个用于片段之间导航的界面

第一个界面

interface Fragment1Navigation {

    fun navigateToFragment1()
    fun navigateToFragment2()

}
Run Code Online (Sandbox Code Playgroud)

第二个接口

interface Fragment2Navigation {

    fun navigateToFragment3()
    fun navigateToFragment4()

}
Run Code Online (Sandbox Code Playgroud)

然后我有实现这两个接口的类

class Navigator: BaseNavigator(), Fragment1Navigation, Fragment2Navigation {

    override fun navigateToFragment1() {
        // some implementation
    }

    override fun navigateToFragment2() {
        // some implementation
    }

    override fun navigateToFragment3() {
        // some implementation
    }

    override fun navigateToFragment4() {
        // some implementation
    }


}
Run Code Online (Sandbox Code Playgroud)

我想在我的 mainActivity 中注入这个 Navigator 类以首先绑定我的导航控制器,我也想在其他片段中注入接口,我制作了这样的模块类

@Module()
class NavigationModule {

    @Provides
    @Singleton
    fun provideNavigator(): Navigator = Navigator()

    @Provides
    fun provideFragment1Navigation(): Fragment1Navigation = Navigator()

    @Provides
    fun provideFragment2Navigation(): Fragment2Navigation = Navigator()
}
Run Code Online (Sandbox Code Playgroud)

我希望这些provideFragmentNavigation和provideNavigatioin提供相同的Navigator(),因此片段中的接口导致与主活动中相同的导航器,但事实证明它提供不同的实例,因此片段中的接口导致与主活动不同的导航器

San*_*Sur 1

有两种方法可以实现这一目标:

  • 使用@Binds而不是@Provides
  • Navigation()对象直接传递给 constructor ofNavigationModule

使用binds

class Navigator @Inject constructor(): BaseNavigator(), Fragment1Navigation, Fragment2Navigation { 

    // body
}
Run Code Online (Sandbox Code Playgroud)

Module

@Module()
abstract class NavigationModule {

    @Binds
    abstract fun provideNavigator(navigator: Navigator): BaseNavigator

    @Binds
    abstract fun provideFragment1Navigation(navigator: Navigator): Fragment1Navigation 

    @Binds
    abstract fun provideFragment2Navigation(navigator: Navigator): Fragment2Navigation
}
Run Code Online (Sandbox Code Playgroud)