Как абстрагировать навигацию в MVVM и AAC навигации - PullRequest
1 голос
/ 01 апреля 2019

Я занимаюсь разработкой приложения с использованием архитектуры MVVM, модулей, компонентов Koin for DI, Android Navigation и ViewModel, и пытаюсь реализовать правильную навигацию между фрагментами (я пытаюсь следовать единому шаблону действий).

Мое приложение состоит из модуля: приложение, которое зависит от всех функциональных модулей: данные и: домен. Приложение используется для DI, и я тоже хотел использовать его для навигации. Так что у него есть MainActivity с NavController. Мои функциональные модули зависят от общего модуля и моего домена.

У меня есть интерфейс Router: общий модуль, который предоставляет все необходимые маршруты для моих фрагментов в функциональных модулях. Я хотел реализовать этот интерфейс на: app. Так, чтобы мои ViewModels в функциях могли внедрить этот маршрутизатор и использовать его, когда они хотят перемещаться

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, мое приложение вылетает с

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

Вы знаете, что не так с моей навигационной абстракцией?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...