Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Валерий Белавенцев — Навигация в Jetpack Compose с использованием Navigation Component

Ozon Tech
February 16, 2023

Валерий Белавенцев — Навигация в Jetpack Compose с использованием Navigation Component

Ozon Tech

February 16, 2023
Tweet

More Decks by Ozon Tech

Other Decks in Technology

Transcript

  1. Опыт: • С 2022 в Ozon – приложение для сотрудников

    ПВЗ • С 2019 по 2022 в Сбере – СберМобайл и СберБанк Онлайн • С 2015 по 2018 – спортивное программирование Интересные проекты:  Приложение с замером габаритов пластиковых окон через AR для производства в Подмосковье  Google Play Instant-приложение для посетителей системы для кафе и ресторанов  Приложение системы мониторинга для интернет-провайдера
  2. • Обзор • Пример использования в Compose • Обзор •

    Проблемы и решения • Делегирование загрузки данных • Сценарий валидации данных • Навигация – это UI
  3. Обзор Navigation Component - набор библиотек для унификации и упрощения

    навигации Библиотеки: • navigation-common​, navigation-runtime, … • navigation-fragment (март 2019) • navigation-compose (январь 2022) Ключевые сущности: • Navigation graph • NavHost • NavController https://developer.android.com/guide/navigation​
  4. Сущности • Destination: то, что видит пользователь • Navigation graph:

    набор destination • NavHost: Composable-контейнер для отображения destination из графа • NavController: объект для управления переключением destination в NavHost
  5. Основные принципы Аргументы: • Задаются в route по аналогии с

    deeplink • Обязательные: route/{param} или опциональные: route?param={param} • По умолчанию разбираются как строки • Извлекаются из BackStackEntry или SavedStateHandle https://developer.android.com/jetpack/compose/navigation
  6. Параметры аргументов • Для опционального необходимо явно задавать navArgument с

    defaultValue или nullable • Можно задать тип аргумента с помощью type • Следует избегать сложных собственных типов https://developer.android.com/guide/navigation/navigation-pass-data
  7. Проблема 1. Символы java.lang.IllegalArgumentException: Navigation destination that matches request NavDeepLinkRequest{

    uri=android- app://androidx.navigation/second// } cannot be found in the navigation graph NavGraph(0x0) startDestination={Destination(0xa211a343) route=first} Значение: “John/Johnny” https://issuetracker.google.com/issues/238336706
  8. Проблема 2. Пустая строка java.lang.IllegalArgumentException: Navigation destination that matches request

    NavDeepLinkRequest{ uri=android- app://androidx.navigation/second/ } cannot be found in the navigation graph NavGraph(0x0) startDestination={Destination(0xa211a343) route=first} Значение: “”
  9. Преимущества делегирования загрузки • Проще логика экранов • Лучше разделение

    ответственностей • Меньше и примитивнее аргумент для второго экрана • Меньше связанности компонентов • Быстрее процесс пересоздания • Предупреждение TransactionTooLargeException
  10. Навигация – это UI Почему navController вызывается из @Composable? Согласно

    видению Google, навигация относится к UI, а не к бизнес-логике Почему навигация относится к UI? Это позволяет адаптировать навигацию под разные устройства В каком случае навигацию можно отнести к бизнес- логике? Если UI не адаптируется под форм-фактор устройства https://developer.android.com/large-screens/gallery
  11. Аспекты • Целевой форм-фактор – смартфоны • UI не адаптируется

    под форм-фактор • Много сценариев с валидацией данных • 10+ feature-модулей • 1-2 аргумента на destination в среднем • Навигация - через ViewModel • Feature-модули имеют собственные подграфы • Собственная иерархия классов для безопасности типов аргументов Решения
  12. • Используйте Uri.encode • Делайте типы аргументов проще • Делегируйте

    загрузку данных • Делайте строковые аргументы опциональными • Используйте отдельный route для передачи null в строковом аргументе • Инкапсулируйте работу с аргументами • Помните про boolean-флаг для навигации назад • Используйте подграфы • Заранее оценивайте допустимость навигации через ViewModel