За всю навигацию в mvi отвечает NavigationMiddleware (NavigationMiddlewareInterface).
Механзим работы этого middleware следующий:
Он принимает события, унаследованные от OpenScreenEvent / CloseScreenEvent, извлекает Route из этих событий, и направляет их в
ScreenNavigator.
ScreenNavigator содержит все стандартные навигаторы (ActivityNavigator, FragmentNavigator, DialogNavigator),
и решает в зависимости от переданного Route (ActivityRoute, FragmentRoute, DialogRoute, итд), какой навигатор использовать, и какой экран тот откроет.
В случае, когда нам нужно подписываться на результат работы экрана, список действий такой:
-
Route, который мы используем, необходимо унаследовать от `SupportOnActivityResultRoute
-
В списке трансформаций подписываемся на
activityNavigator.observeResult(route), гдеroute- нужный нам роут. -
В OpenScreenEvent мы передаем нужный нам Route.
-
После этого, передаем в navigationMiddleware это событие.
Для упрощения переиспользования, NavigationMiddleware можно использовать в middleware родительских экранов через композицию событий. Механизм подробное описан здесь.
Схематично все вышеописанное можно отобразить так:
