Обновление Odyssey
Всем привет. Хотелось бы немного рассказать о том, почему я переписал полностью библиотеку и поделиться теми приключениями, которые мне пришлось преодолеть на пути первого релиза.
Все начало с того, что я летел в самолете домой и мне не давала покоя мысль, что мне очень хотелось бы сделать декларативный фреймворк навигации, но для мультиплатформы, который позволял бы решать эту задачу полностью. Причем решать именно типовые проблемы, такие как флоу, диалоги, навигация в табах, сохранение стека и так далее.
Я накидал в блокнотике идею как оно должно выглядеть и благополучно забыл, пока мы в Леруа не начали делать мультиплатформенное приложение. И тут я понял, что момент настал. Так родилась первая версия и тут я совершил на самом деле фундаментальную ошибку. При общей простоте идеи и ее работоспособности в целом все ломалось о попытку применить это к iOS. Плюс были проблемы кое-какие, связанные с сохранением бэкстека
Ключевым моментом идеи было создание класса, который я назвал RootController. Этот класс по задумке должен был стать такой основной точкой, через которую проходит вся навигация, а он уже разруливает куда и какой экран открыть. И в связке с компоузом это работало отлично. Но, как я уже сказал, при совмещении с iOS я столкнулся с фундаментальной проблемой того, что невозможно сделать некий общий тип, который можно было бы передать в RootController, который можно было бы нарисовать. Конечно, можно было бы костыльнуть, сделать тип Any, но на самом деле это была бы только иллюзия коммонизации, а мне хотелось сделать именно через common код с небольшими вкраплениями особенностей платформы.
Где-то на 6 раз создания очередного Proof of Concept я отложил IDE в сторону и взял в руки листочек. На самом деле кодил я на листочке последний раз в университете еще и вот она ирония, что у нас принято возмущаться как это так мне дают листочек вместо IDE, я что должен помнить все команды? А тут я сам потянулся к ручке и блокноту
Все начало с того, что я летел в самолете домой и мне не давала покоя мысль, что мне очень хотелось бы сделать декларативный фреймворк навигации, но для мультиплатформы, который позволял бы решать эту задачу полностью. Причем решать именно типовые проблемы, такие как флоу, диалоги, навигация в табах, сохранение стека и так далее.
Я накидал в блокнотике идею как оно должно выглядеть и благополучно забыл, пока мы в Леруа не начали делать мультиплатформенное приложение. И тут я понял, что момент настал. Так родилась первая версия и тут я совершил на самом деле фундаментальную ошибку. При общей простоте идеи и ее работоспособности в целом все ломалось о попытку применить это к iOS. Плюс были проблемы кое-какие, связанные с сохранением бэкстека
Ключевым моментом идеи было создание класса, который я назвал RootController. Этот класс по задумке должен был стать такой основной точкой, через которую проходит вся навигация, а он уже разруливает куда и какой экран открыть. И в связке с компоузом это работало отлично. Но, как я уже сказал, при совмещении с iOS я столкнулся с фундаментальной проблемой того, что невозможно сделать некий общий тип, который можно было бы передать в RootController, который можно было бы нарисовать. Конечно, можно было бы костыльнуть, сделать тип Any, но на самом деле это была бы только иллюзия коммонизации, а мне хотелось сделать именно через common код с небольшими вкраплениями особенностей платформы.
Где-то на 6 раз создания очередного Proof of Concept я отложил IDE в сторону и взял в руки листочек. На самом деле кодил я на листочке последний раз в университете еще и вот она ирония, что у нас принято возмущаться как это так мне дают листочек вместо IDE, я что должен помнить все команды? А тут я сам потянулся к ручке и блокноту
И вот спустя какое-то время я нащупал ключевую мысль как можно было сделать, чтобы это все работало. Надо, чтоб вызов основных функций рисования никаких типов не возвращал и не требовал ничего передавать снаружи. Нужно было взять некий канвас, который был бы Активити для Андроид, JFrame для Desktop и UIViewController для iOS и просто рисовать на нем, то есть порождать экраны и просить канвас их нарисовать.
Сказано - сделано. И теперь это работает именно так. Основной сущностью стал ScreenHost
Пример одной из реализаций ScreenHost
Таким образом для декларатива очень легко получается рисовать какие-то штуки. Более того я заготовил специальные классы для flow и multibackstack
Они называются соответственно FlowRootController и MultiStackRootController
Они позволяют нам очень легко управлять какими-то вложенными навигациями и даже стеком вложенных навигаций. На самом деле на базе MultistackRootController можно строить различные табы (не только нижнюю навигацию), с сохранением состояния backstack
Пример использования этого подхода можно посмотреть здесь и здесь соответственно
Они позволяют нам очень легко управлять какими-то вложенными навигациями и даже стеком вложенных навигаций. На самом деле на базе MultistackRootController можно строить различные табы (не только нижнюю навигацию), с сохранением состояния backstack
Пример использования этого подхода можно посмотреть здесь и здесь соответственно
А вот так выглядит это на стороне Андроида (и точно также в iOS и у Desktop, кстати)
Вот собственно и весь код. Пример разумеется доступен на гитхабе - https://github.com/AlexGladkov/Odyssey
Теперь логичный вопрос, а когда релиз? Я сейчас занимаюсь прохождением процедуры регистрации в maven central и, надеюсь, за следующую неделю я его завершу. Тогда библиотеку можно будет пощупать
Что в ближайших планах?
Теперь логичный вопрос, а когда релиз? Я сейчас занимаюсь прохождением процедуры регистрации в maven central и, надеюсь, за следующую неделю я его завершу. Тогда библиотеку можно будет пощупать
Что в ближайших планах?
- Есть желание сделать генерацию графа декларативной
- Также я хочу сделать extension для компоуза, чтоб можно было составлять сразу дерево с экранами так как это происходит в Jetpack Compose Navigation
- Плюс нужно сделать примеры на iOS и JS.
Надеюсь было интересно. Всем спасибо и пока
Надеюсь было интересно. Всем спасибо и пока
multiplatform
navigation
odyssey