我只有一个活动,并且使用导航组件具有多个片段样式的应用程序。
我将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提供一个类的实例,然后再开始使用它呢?
答案 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()) }