使用 DI 工具与 findNavController。

3

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

我正在使用Koin进行依赖注入。我希望按照干净架构的原则创建一个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个回答

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()) }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接