如何在MVVM和导航AAC中抽象导航

时间:2019-04-01 19:49:53

标签: android mvvm kotlin architecture android-architecture-navigation

我正在使用MVVM体系结构,模块,Koin for DI,Android导航和ViewModel组件开发应用程序,并且试图在片段之间实现适当的导航(我试图遵循单一活动模式)。

我的应用程序由模块:app组成,该模块对所有功能模块:data和:domain都具有依赖性。该应用程序用于DI,我也想将其用于导航。因此它具有带有NavController的MainActivity。 我的功能模块依赖于通用模块和我的域。

我在:common模块中具有路由器接口,该接口为功能模块中的片段提供了所有必需的路由。我想在:app上实现该接口。这样我的功能中的ViewModel可以注入此路由器并在需要导航时使用它

MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navigationModule = NavigationModule(
            RouterImpl(
                findNavController(R.id.main_content)
            )
        ).navigationModule
        loadKoinModules(navigationModule)

    }

RouterImpl.kt

class RouterImpl(private val navController: NavController) : Router {
    override fun fragmentAtoFragmentB() {
        navController.navigate(R.id.action_fragmentA_to_fragmentB)
    }

    override fun fragmentAtoFragmentC() {
        navController.navigate(R.id.action_fragmentA_to_fragmentC)
    }
}


RouterModule.kt


class NavigationModule(router: Router) {

    val navigationModule = module(override = true) {
        single {
            router
        }
    }

}

它正在工作,但是当我导航到片段B时,我旋转以便重新创建活动,并使用新的NavController重新创建路由器,然后回到片段A并尝试导航到片段B,我的应用程序崩溃了,< / p>

 java.lang.IllegalArgumentException: navigation destination com.toto.myapp:id/action_fragmentA_to_fragmentB is unknown to this NavController

您知道我的导航抽象出了什么问题吗?

谢谢

0 个答案:

没有答案