Навигация в мобильном приложении: координаторы и роутеры
Вопрос
Как вы организуете навигацию в приложении и почему не внутри экранов?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Экраны не знают о соседях, сообщают о событиях
Координатор или роутер собирает экраны и делает переходы
Иерархия координаторов по потокам, удаление дочерних при завершении
Навигация как состояние в декларативных UI
Deep links разбираются в маршруты в одном месте
Тестируемость переходов
Что могут спросить следом
- Как координатор узнаёт, что пользователь ушёл свайпом назад?
- Как передать результат с дочернего экрана родителю?
Разбор
Экраны у меня не знают друг о друге: экран списка сообщает «выбран товар 42», а куда идти дальше, решает координатор (или роутер). Это позволяет переиспользовать экран в разных потоках и тестировать переходы отдельно. Координаторы образуют дерево по потокам: приложение, авторизация, основной поток, оформление заказа. Дочерний сообщает родителю о завершении, и тот его удаляет. Отдельно ловлю системный «назад» и закрытие свайпом, иначе дочерние координаторы утекают. В SwiftUI и Compose навигация естественно становится состоянием: массив маршрутов, который меняет роутер. Deep links парсятся в те же маршруты в одном месте, поэтому ссылка и нажатие кнопки ведут по одному коду.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Восстановление навигации после смерти процесса
Следующий вопрос
Система deep links в мобильном приложении