3

我有一个使用导航组件的活动和多个片段样式的应用程序。

我正在为我的 DI 使用 Koin。我想根据干净架构的假设在我的应用程序中创建一个导航器类。

这个假设的类看起来像:

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 提供一个类的实例,然后开始使用它?

4

1 回答 1

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()) }
于 2020-05-18T08:11:27.800 回答