Jetpack Navigation. Как сделать навигацию в Android удобной? [Ru, Kotlin\Android]

Sdílet
Vložit
  • čas přidán 28. 07. 2024
  • Всем привет, Jetpack Navigation вышла уже достаточно давно, но из-за того, что изначально она получилась очень сырой она не получила популярности. Однако, на мой взгляд, сейчас это уже вполне себе хорошая библиотека, и ей можно пользоваться. Поэтому я решил сделать это видео с полным разбором функционала Jetpack Navigation и что можно делать с помощью нее
    Если видео вам было полезно, пожалуйста, поделитесь им с друзьями
    Ссылка на репозиторий:
    github.com/AlexGladkov/Jetpac...
    Тайм-коды:
    00:00:00 - Вступление
    00:04:56 - Создаем основу для навигации
    00:10:05 - Разбор графа навигации
    00:14:08 - NavController
    00:25:18 - Навигация с анимацией
    00:29:24 - Bottom Navigation (Версия 2.3.5)
    00:42:31 - Subgraphs (Версия 2.3.5)
    00:49:05 - Bottom Navigation (Версия 2.4.0)
    00:55:00 - Многомодульная навигация
    Напоминаю, что видео вначале выходят для моих патронов и спонсоров. Стать им можно по ссылке ниже
    ===========================================
    Подписаться на boosty
    boosty.to/mobiledev
    Стать Патроном канала и получить доступ к уникальному материалу
    / mobiledeveloper
    ===========================================
    Полезные статьи из мира мобильной разработки
    Яндекс.Дзен - zen.yandex.ru/id/5e4aa0a9f2b9...
    Teletype - teletype.in/@alexgladkov
    Мобильный разработчик в других соц. сетях
    =======================
    Вконтакте - mdeveloper
    Instagram - / nplau
    Телеграм - t.me/mobiledevnews
    =======================
    Ставь лайк и расскажи друзьям, чтобы они тоже попробовали эту технологию

Komentáře • 89

  • @Densoll
    @Densoll Před 4 měsíci +2

    Блин спасибо тебе большое, очень много пересмотрел видосов с этой навигацией засратой, как её правильно реализовать с single activity и вот наткнулся на твой ролик 21 года, ещё раз спасибо, очень сильно помог, так как пишу диплом) 🤝

  • @killonstar
    @killonstar Před rokem +2

    Немного сумбурное объяснение работы с модулями получилось, но если потом разобрать проект самому, то все становится ясно. Спасибо за проделанную работу!

  • @SanyaX2010
    @SanyaX2010 Před 2 lety +3

    Спасибо за видео! Как всегда очень доступно, всё по делу и без "воды".

  • @mccokol7536
    @mccokol7536 Před rokem +1

    Блин!! как я благодарен автору! Все сразу стало по местам, а то "эти" курсы...

  • @user-mx3he2iz2w
    @user-mx3he2iz2w Před 2 lety +1

    Круто! Своевременное видео)) Как раз сейчас pet проект начинаю, хотел попробовать)

  • @user-sf8xx1hq7c
    @user-sf8xx1hq7c Před 2 lety

    Огромное спасибо) как раз то, что нужно

  • @user-zp3qc2ku5m
    @user-zp3qc2ku5m Před rokem +1

    Алекскй ты большой молодец ! Очень помогло твоё видео . Продолжай помогать людям . Удачи тебе во всём !

  • @AndriiDV
    @AndriiDV Před 2 lety

    Алексей спасибо за качественный контент.

  • @aokruan
    @aokruan Před 2 lety

    Спасибо за подробные инструкции. Теперь есть шаблон для старта. ✌

  • @user-jl7kw8hx6i
    @user-jl7kw8hx6i Před 2 lety

    Огромное спасибо, видео Огонь!!!!

  • @Vlad_Gromov_1992
    @Vlad_Gromov_1992 Před 2 lety +15

    Ждем выпуск про многомодульность

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety +1

      Это большая тема да )

    • @Vlad_Gromov_1992
      @Vlad_Gromov_1992 Před 2 lety +1

      @@MobileDeveloper прям очень актуально будет. Сделай плиз, ты все такие очень очень опытный разработчик

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      Когда-нибудь мы до этого дойдем

  • @user-bu4lg3on9h
    @user-bu4lg3on9h Před 2 lety +1

    Спасибо!

  • @ephemerayne8957
    @ephemerayne8957 Před 2 lety

    Годнота :)

  • @user-ui1km7uw5g
    @user-ui1km7uw5g Před 2 lety +3

    Алексей спасибо за выпуски, планируется ли выпуск по workmanager, желательно в 2 части, вступление и в проекте)

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      Когда-нибудь да ) но не факт, что в ближайшее время

  • @coffemilk652
    @coffemilk652 Před rokem

    Thanks, very useful explanation.

  • @paulsoja2732
    @paulsoja2732 Před 2 lety

    Спасибо за обзор. Сейчас все поголовно используют эту навигацию, а мне она не зашла. Вот думал может я не разобрался, но после просмотра видео она всё также мне не нравится. Всё помпезно, красиво, но с тем же cicerone всё проще и удобнее.

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety +1

      Ну, такое может быть :) как говорится на вкус и цвет )

  • @user-ml2xz2pn3p
    @user-ml2xz2pn3p Před 2 lety

    Спасибо за видос

  • @alexv1071
    @alexv1071 Před 2 lety +2

    Тот момент, когда с первой минуты понимаешь, что контент очень годный!!! Спасибо за твой труд!

  • @user-il4oo4og7h
    @user-il4oo4og7h Před 2 lety

    Спасибо за контент.
    Недавно мне нужно было сделать анимацию главного меню, как у вьюпейджера(то есть при переключении от первого пункта к третьему - слайд-анимация через второй. Не придумал ничего лучше, чем использовать вьюпейджер, с тремя фрагментами, в который передавал соответствующий навграф. Получилось 4 навконтроллера, один главный (для сплеша, авторизационных экранов, экрана с главным меню и т.д.) и по одному на каждый пункт меню. Таким образом добился нужной анимации, но естественно сломалась навигация по кнопке "назад", пришлось обрабатывать самому. Если мы на фрагменте с меню, то вызывать popup() у навконтроллера текущего пункта меню, а если он не смог, то у главного навконтроллера. Кроме того некоторые переходы должны были быть на экраны без боттомнавбара, приходилось следить, чтобы использовался нужный навконтроллер. Это все конечно решалось довольно просто, буквально парой интерфейсов, но всё же нет ли способа проще?

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety +1

      Для такой кастомной штуки, врядли будет вариант попроще. Ну то есть я могу предложить вариант с анимацией внутри вью, но, имхо, это даже сложнее будет)

  • @Nomad7541
    @Nomad7541 Před 2 lety +6

    К сожалению jetpack navigation самое неудачное апи из jetpack. На compose они вообще сделали route навигацию по типу веба.

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      Не соглашусь. В видео разобраны все самые популярные кейсы и они очень легко делаются

    • @MrPwnzrus
      @MrPwnzrus Před 2 lety +3

      Мне кажется это супер удобным. Интеграция с bottomnavview и раздельный бекстек для вкладок из коробки , диплинки , указание до какого фрагмента делать popbackstack, аргументы без всяких newInstance и прочего. Так или иначе чтобы такое сделать пришлось бы писать свои костыли а тут уже все в либе

  • @edm-ko2017
    @edm-ko2017 Před 2 lety

    Спасибо за видео. Было бы интересно узнать про более сложную навигацию. Например как открыть по диплинку фрагмент внутри графа с bottom navigation если есть тот же логин.

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      Интересный кейс, но он уже больше к диплинкам относится, нежели к навигации

    • @kanatbekov_24
      @kanatbekov_24 Před 2 lety

      @@MobileDeveloper есть ли у вас хорошие ссылки на habr, medium про диплинкам.

  • @PandaTop.
    @PandaTop. Před 2 lety

    Что скажите про навигацию через ViewModel? Мне вообще интересно, какую именно навигацию используют в проектах....

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety +1

      А что значит навигация через ViewModel?

  • @GriNAME
    @GriNAME Před 2 lety +1

    А по компоузу будет подобное видео? Не как его интегрировать в готовом проекте, а так же с нуля, чтобы минимум лишней информации для простоты восприятия

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      czcams.com/video/cX7RVGj19iU/video.html
      А это видео чем не подходит?)

  • @denislopatkin6996
    @denislopatkin6996 Před 5 měsíci

    Капец демо как мега проект! ))
    Сколько вы потратили времени на данное демо всего?

  • @user-uf5mr2xv9f
    @user-uf5mr2xv9f Před 2 lety +1

    очень круто, спасибо, скажи а что если я хочу в каком то n-ом дереве фрагмента спрятать bottomNavigationView. Я могу это провернуть в данной реализации или нужно будет выносить bottomNavigationView в SingleActivity ?

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety +1

      Да нет можно на какой угодно вложенности это делать по сути. У нас так и работает )

    • @user-uf5mr2xv9f
      @user-uf5mr2xv9f Před 2 lety +1

      @@MobileDeveloper а как мне например с FeedFragment получить доступ к bottomNavigationView в MainFragment?

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety +1

      А зачем?

    • @user-uf5mr2xv9f
      @user-uf5mr2xv9f Před 2 lety

      Вдруг понадобиться фрагмент из которого не нужно уходить нажимая на bottomNavigationView. И для это нужно же его спрятать (isVisible=false). А менеджером по управлению фрагментов(корнем) вляется MainFragment

  • @denislopatkin6996
    @denislopatkin6996 Před 5 měsíci

    Автору огромное спасибо!
    Тем не менее по итогу получается что если стоит боковое меню или нижнее меню, то управление бекстеком происходит коряво. То есть бекстек при переходе создается полностью, а очистка только при нажатии кнопок назад. Такая ситуация очень грусная… и если я при переходе хочу в начале очистить стек и только потом перейти, то такой опции видимо вообще не предусмотрено…

  • @user-xj3xo8cz5b
    @user-xj3xo8cz5b Před 2 lety

    multibackstack с нижнем меню, работает как то криво, или чего не понимаю. Есть 5 пунктов меню, когда идёт переход между начальные фрагментами в меню, все нормально. Но если зайти в дальше по фрагменту, например в пункте меню C, потом перейти в A. А после нажать на пункт меню C. То фрагмент будет то же, что и должен быть, но пункт меню активные показывает A.

  • @glebdolskiy
    @glebdolskiy Před 2 lety

    27:55 Что делать с устаревшим popUpTo? Предлагает popUpToId, но ошибки разные выдаёт

  • @majorikKIK
    @majorikKIK Před 2 lety +4

    Navigation Components, как по мне, ограниченное решение для навигации, которое иногда бьет по рукам, если отклоняешься от идей библиотеки.
    Для многомодульного проекта её можно использовать, но не так, как вы описываете в видео, объясню почему:
    Рассмотрим пример приложения, в котором есть 3 экрана:
    - главный экран с товарами
    - детали товара и создатель
    - экран профиля пользователя с списком созданных им товаров
    Тогда судя по вашей логике, нужно будет сделать след. зависимости:
    - home -> detail
    - detail -> profile
    - profile -> detail
    1. Ваши фиче-модули зависят от других фиче модулей и это проблема, если на этом примере все замечательно, то в реальных приложений с этим будут проблемы, т.к. начнется hell из зависимостей между модулями, а скорость сборки увеличится.
    2. В видео опять же повторю рассматривается простой пример и если будет необходима циклическая зависимость между экранами, которые находятся в разных модулях, то с графом нужно будет костылять.
    Первой мыслью будет сделать в detail графе include profile'а, а в profile include detail'ов, в итоге словите эксепшн из-за того, что будет пытаться построится граф навигации прыгая из одного графа, в другой и обратно и так до тех пор, пока не будет переполнение стэка. (хотя возможно в последних версия что-то поменялось, но я сомневаюсь)
    3. И последний пункт, ниже кто-то писал, что эта библиотека на самом деле крутая, с чем я тоже не соглашусь. Есть явные проблемы:
    - работа с диплинками, раз уж о них упоминалось, в больших проектах и особенно модульных с ними могут быть сложности в реализации, например, когда нужно открыть экран в конкретном табе на экране, тут либо костылять, либо страдать)
    - переопределение поведения Навхоста, например, чтобы фрагменты открывались не через .replace, а через .add
    - в правильно организованных модульных проектах придется жертвовать каким-то из преимуществ этой либы, например, библиотекой safe-args (т.к. модули не будут знать ничего друг о друге, то и нет смысла в генерации destination'ов)
    - создание multi-stack навигации, в видео было сказано, что если сделать для каждой отдельный граф, то "сложность резко понизится", с чем я не согласен, скорее всего в какой-то момент просто придете к мысли, что поддержка нескольких графов становится просто болью + ко всему добавляется boilerplate код, не говоря уже о качестве) Это будет связано с тем, что скорее всего понадобится на разных вкладках делать переходы на одни и те же экраны (надеюсь понятно о чем я)
    Как по мне, библиотека хорошо подходит, если в приложении простой флоу навигации и приложение не многомодульное (речь про реальные многомодульные проекты)
    Подводя итог, для многомодульного проекта нужно понимать, что при использовании navigation components придется в любом случае чем-то жертвовать.
    Советую ознакомится с серией статей на хабре - Navigation Component-дзюцу

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      Спасибо большое за такой развернутый комментарий. Всегда очень нравится, когда комментарии несут пользу :)
      Теперь по существу.
      По моей логике так не будет, потому что в видео тестовый проект, в реальных условиях я буду исходить из ситуации. Конкретно в этой ситуации, естественно, учитывая связность деталки и профиля, они у меня будут просто в одном модуле вероятно лежать.
      Навигацию мы использовали в приложении на 30 модулей (это, конечно, не 200 как у некоторых), но и не 1 и не 3. И все работало прекрасно никаких проблем мы не испытывали и тем более мы не делали никаких циркулярных зависимостей. Так что у нас все норм работало я могу рекомендовать эту навигацию в том числе и для многомодульных приложений. Сейчас перешли на собственное решение, но это связанно с тем что мы ушли в мультиплатформу
      К сожалению, есть нюанс в делании видео именно в плане создания видео. Я раньше (в истории канала можно посмотреть) использовать готовые сложные проекты, которые показывали реальную ситуацию (скажем кучу модулей или еще что-то), но это приводило как раз к тому, что люди путались и ничего не понимали. Поэтому я отказался от такого и примеры да специально простые.
      Переопределение методов навхоста это действительно будет очень сложно (если не невозможно), но надо понимать, что эта библиотека она в связке с другими решениями гугла работает, поэтому безусловно они дизайном либы подталкивают к правильному с их точки зрения использованию. Кому нравится окей, кому не нравится тоже окей.
      Насчет диплинков, кстати, тоже никаких проблем не было, мы как раз всю навигацию сделали в итоге диплинковой и тоже все отлично работало ) Может мы что-то делали не так)

    • @majorikKIK
      @majorikKIK Před 2 lety +1

      ​@@MobileDeveloper Очень сомнительное решение вынести экраны профиля и товаров в один модуль, потому что звучит это как костыль, вместо решения проблемы и при этом тогда теряется смысл многомодульности.
      Посоветовал бы не привязываться к библиотеке только потому, что она от гугла. Также, реализация всей навигации в проекте с помощью диплинков опять звучит как уход от проблемы и решение "по-быстрому". К тому же, если было принято такое решение, значит реализация навигации с Navigation Components в многомодульных проектов все же имеет определенные проблемы + привязанность к библиотеке, о чем я написал выше. Хотя согласен, что это решение может работать 😀
      "они дизайном либы подталкивают к правильному с их точки зрения использованию" - нужно понимать, что не проект подстраивается под библиотеку, а наоборот и если на маленьких проектах это работает хорошо, то на больших или сложных это уже может не работать.
      Кстати, когда я говорил про модульные проекты, это не обязательно 200+ модулей, тут главное какая архитектура и то как он разбивается на модули.
      Мое мнение, что лучше рассматривать сложные примеры и кейсы (если конечно они написаны хорошо), чем "тестовые", которые наоборот еще больше могут усложнить понимание реализации и последствий.

    • @mironoff2007
      @mironoff2007 Před 2 lety

      @@majorikKIK , а что лучше использовать для навигации? Я пока знакомлюсь с разработкой под андроид и пытаюсь найти инструменты, которые лучше всего подходят, чтобы не учить лишнего

    • @dmitrychernenko-2574
      @dmitrychernenko-2574 Před 8 měsíci

      @@mironoff2007 как твоя учёба? выучил андроид? как успехи ?

    • @mironoff2007
      @mironoff2007 Před 8 měsíci

      @@dmitrychernenko-2574 уже работаю полтора года

  • @diptan83
    @diptan83 Před 2 lety

    Спасибо за очень качественный контент.

  • @helton57
    @helton57 Před 2 lety

    Привет, крутой контент, сразу после просмотра видео понял, как работать с Jetpack Navigation, и решил затащить в проект)
    Есть вопрос - multibackstack работает лишь если я повторно нажимаю на пункт меню, но не по нажатию onBackPressed? Например, я с пункта меню "Лента" перешел на фрагмент "Detail" и потом нажимаю на пункт меню "Настройки". И дальше, если я нажму на пункт меню Лента, то все ок - я увижу фрагмент "Detail", но если я вместо этого нажму назад, то попаду на пустой пункт меню "Лента"... как сделать так, чтобы "Detail" отображался в обоих случаях?

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      По идее навигация из коробки умеет работать с backpressed. Тут надо логгировать, смотреть код, так я не понимаю в чем у вас проблема

  • @luen6019
    @luen6019 Před 2 lety

    Есть ли разница в jetpack compose и compose for desktop

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      По большому счету нет разницы

  • @viacheslav4576
    @viacheslav4576 Před 2 lety

    Дякую за якісний контент. Дуже багато корисної інформації отримав з твоїх відео. Чекаю з нетерпінням нових відео. Бажано для новачків))

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      Не очень понял, что написано, но спасибо )

  • @dmitryobukhov6681
    @dmitryobukhov6681 Před 2 lety

    Спасибо, крутое видео, то есть теперь мы можем использовать navigation вместо intent?

  • @user-vz1xh4re2d
    @user-vz1xh4re2d Před rokem

    Не указанно возможность safeArg

  • @masli1337
    @masli1337 Před 2 lety

    как сделать build gradle в kts файле?

  • @Ashimoro
    @Ashimoro Před 2 lety

    Спасибо!
    А как открыть деталку без нижней навигации?

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      В примере на гитхабе есть как раз такая реализация)

  • @user-oc7py1vy6s
    @user-oc7py1vy6s Před 2 lety

    Что там про продолжение серии видео про сборщики мусора?

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety +1

      Монтируется) я стараюсь снять видео сейчас, чтоб побольше успеть смонтировать за сентябрь ) потом сяду монтировать это видео )

  • @rnsization
    @rnsization Před 2 lety

    Выглядит красиво, но на практике оказалось увы, что не везде подходит. Особенно если многомодульный проект где доступ к модулям через интерфейс feature api и модулем может быть как один экран, так и отдельный flow.

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      Можно внутри модуля делать навигацию через jetpack все равно будет удобно. А переходить можно через реализацию интерфейса того же типа launch или navigate

    • @rnsization
      @rnsization Před 2 lety

      @@MobileDeveloper согласен, но когда получаются фичи, как отдельные переиспользуемые экраны, тут уже не так гладко, а использовать кучу диплинков уже не так красиво, как хотелось бы.

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety +1

      Вот кстати, я сейчас сделал всю навигацию между модулями через дип линки. Пока полёт нормальный, плюс есть возможность из вебвью модулей обращаться к внутренним модулям

  • @tequilaonelove
    @tequilaonelove Před 2 lety

    оставил коммент, но его нету почему-то )) , а еще нифига не понятно, если выпуск от 8 сентября, каким образом здесь комменты есть, которые неделю назад оставили)

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety +1

      Я видел коммент, но некоторые комменты сразу же удаляет ютуб. Причём именно удаляет, а не на модерацию отравляет. Возможно из-за ссылок
      Насчёт комментов это потому что видео вначале выходит для спонсоров и там оно может лежать довольно долго ) например сейчас есть два видео, которые доступны на бусти (не считая тех что является эксклюзивом)

    • @tequilaonelove
      @tequilaonelove Před 2 lety

      ​@@MobileDeveloper Понятно тогда теперь всё. А то сначала подумал что комментарий и вовсе не отправился. Плохо что нет на ютубе такой опции, посмотреть, что за комменты оставлялись, да и вообще активность пользовательскую расширенную, а не только просмотренные ролики.. =)

    • @tequilaonelove
      @tequilaonelove Před 2 lety

      Тогда еще такой вопрос небольшой., связанный с навигацией. Использовав ту библиотеку, о которой я писал в заболоченном комментарии была такая проблема, что при переходе по вкладкам в навигации (bottomNavigationView) был какой то неприятный фриз., когда происходит attach/detach фрагментов.. Единственным выходом из ситуации была костыльная проверка, с помощью которой проверялось, если в стеке сейчас лежит главный фрагмент только, то выполнялся "fragmentManager.beginTransaction().hide()" вместо ".detach()". Задержки при переключении между вкладками/стеками происходят из за того что фрагмент "тяжёлый" или как ?

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      Ну просто на это ж время нужно, там ещё поди весь код инициализировался в onCreateView

  • @p.polunin
    @p.polunin Před 5 měsíci

    Материал очень полезный, но для кого автор рассказывает, непонятно, видимо для себя любимого. Посыл рваный, несвязный, даже с пересмостром уловить трудно, ну, главное, чтобы ему самому было понятно.

  • @DmitryKatsubo
    @DmitryKatsubo Před 2 lety

    жестяная жесть, конечно, кто в iOS это все делал - посмотрели и вышли нервно покурить, говорить что после такого разработчики какие-то там молодцы язык не поворачивается

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      От iOS есть много отличий. Во-первых там сториборды это сразу же и верстка, а здесь верстка в отдельном компоненте находится + куча интеграций с диплинками и прочими историями из коробки.

    • @DmitryKatsubo
      @DmitryKatsubo Před 2 lety

      @@MobileDeveloper у меня после просмотра появился вопрос, если при переходе между фрагментами предыдущий фрагмент персоздается заново, как поддерживать нужный мне стек фрагментов (например процесс регистрации) в каком-то стабильном состоянии? При возврате на шаг назад хотелось бы видеть к примеру что форма заполнена данными

    • @MobileDeveloper
      @MobileDeveloper  Před 2 lety

      Это можно делать в связке с ViewModel, я потом отдельно про это видео сниму, но в рамках видео про Compose. Но в старой верстке точно также будет работать. К слову сам фрагмент не уничтожается, уничтожается только view, так что теоретически ты можешь просто эти данные в поле сложить в классе, а в onCreateView заполнить этими данными и должно работать)

  • @yaroslav_kior
    @yaroslav_kior Před 11 měsíci

    Спасибо!

  • @d.mertsalov
    @d.mertsalov Před 2 lety

    Спасибо!

  • @user-oc7py1vy6s
    @user-oc7py1vy6s Před 2 lety +1

    Спасибо!