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

android - Dagger 2 injecting multiple interface and the implementation class

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

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

第一个界面

interface Fragment1Navigation {

    fun navigateToFragment1()
    fun navigateToFragment2()

}

第二个界面

interface Fragment2Navigation {

    fun navigateToFragment3()
    fun navigateToFragment4()

}

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

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
    }


}

我想在我的 mainActivity 中注入这个 Navigator class 以首先绑定我的 navcontroller 并且我想在其他片段中注入接口并且我制作了这样的模块 class

@Module()
class NavigationModule {

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

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

    @Provides
    fun provideFragment2Navigation(): Fragment2Navigation = Navigator()
}

我希望那些 provideFragmentNavigation 和 provideNavigatioin 提供相同的 Navigator(),因此片段中的界面会导致与主界面中相同的导航器 activity,但事实证明它提供了不同的实例,因此片段中的界面会导致不同的导航器来自 mainactivity

的导航器

您可以通过两种方式实现:

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

使用binds

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

    // body
}

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
}