使用DI工具的findNavController

时间:2019-05-19 09:41:15

标签: android android-jetpack android-navigation koin

我只有一个活动,并且使用导航组件具有多个片段样式的应用程序。

我将Koin用于DI。我想按照干净架构的假设在我的应用程序中创建一个Navigator类。

该假设类如下:

class Navigator(private val navHostFragment: NavHostFragment)
{

    fun toStudentsProfile():Unit
    {
        val action = HomeFragmentDirections.toStudentsProfile()
        navHostFragment.findNavController().navigate(action)
    }

    fun toTeachersProfile():Unit
    {
        val action = HomeFragmentDirections.toTeachersProfile()
        navHostFragment.findNavController().navigate(action)
    }
}

我现在的问题是如何在Koin容器下创建它?

val platformModule = module {

    single { Navigator("WHAT CAN BE DONE HERE") }
    single { Session(get()) }
    single { CoroutineScope(Dispatchers.IO + Job()) }

}

此外,Koin组件在navhostfragment准备就绪之前就已经准备就绪,因此它不能满足依赖关系。

有没有一种方法可以为Koin提供一个类的实例,然后再开始使用它呢?

1 个答案:

答案 0 :(得分:1)

Koin允许在注射时使用参数

val platformModule = module {
    factory { (navHostFragment: NavHostFragment) -> Navigator(navHostFragment) }
    single { Session(get()) }
    single { CoroutineScope(Dispatchers.IO + Job()) }
}

我已经将依赖项声明为工厂,我想它也可以适用于活动。声明为单一将导致行为异常,就像重新创建活动(因此navhostFragment)一样,Navigator对象将引用已销毁的navhostFragment。

由于这些片段将是navhostFragment子级,因此您可以通过以下方式获取片段中的Navigator对象:

val navigator: Navigator by inject { parametersOf(requireParentFragment()) }