В помощь мобильному разработчику

Exrin — расширенная навигация в Xamarin Forms

Александр Алексеев

Exrin — это фреймворк MVVM с более высокими уровнями абстракции, чем большинство других фреймворков. Он предназначен для работы с Xamarin Forms, но не имеет зависимости от них. Он, безусловно, подкидывает мысли о том, как следует разрабатывать проект, и при этом предоставляет некоторые очень продвинутые функции навигации, которыми можно пользоваться с относительной легкостью.

Exrin основан на ViewModel-навигации. Это означает, что переход осуществляется от ViewModel к ViewModel, а не от View к View. Каждый View связан с ViewModel по принципу 1 к 1, но ViewModel никогда не распознаёт того, что View является связанным с ним. На следующей диаграмме представлен обзор того, как составляющие Exrin сочетаются друг с другом по отношению к навигации. Все это будет объяснено ниже.

exrin

Пример кода: Вашему вниманию предлагается небольшой шаблон проекта Exrin Sample, который даст Вам представление о том, как на деле работает мобильное приложение, созданное с использованием данной технологии.

Стеки

У Xamarin Forms есть NavigationStack и ModalStack. Exrin никогда не использует ModalStack, только NavigationStack. Exrin создает собственные стеки. Всякий раз, когда Вам нужно переключать стеки, он меняет MainPage на следующий стек и также позволяет вернуться к предыдущему стеку, прямо туда, где Вы остановились.

Обычный вариант, который я использую в этом случае — это AuthenticationStack и MainStack. Вам вряд ли нужно то, чтобы пользователь с помощью обратной навигации мог опять оказаться на странице входа в систему. Она является часть другой передачи страниц и должна храниться отдельно. Стеки на самом деле создаются очень просто: Вы устанавливаете стартовую страницу и назначаете Views для ViewModels.

 

NoHistory и кэширование View

Перед тем как двигаться дальше, я бы хотел обратить Ваше внимание на небольшую особенность, которая позволяет кэшировать view, благодаря чему ему не приходится воссоздаваться всякий раз, когда Вы визуализируйте его. NoHistory является интересной функцией, поскольку с помощью неё Вы можете обозначать любое View-ViewModel путём отображения. Когда эти значения установлены верно, тогда в случае, если одно view проталкивается поверх другого или если изменяется стек, то это view будут без разговоров снято со стека. И при возвращении, его больше не будет в истории навигации.

 

Переопределение ViewModel

Одним из больших преимуществ Exrin является то количество переопределений, которое вы получаете в каждом ViewModel для начала или завершения задач на любом этапе процесса навигации.

 

Навигация

Навигация в Exrin фактически осуществляется с помощью метода операции разделения (Operation Separation). Вы просто возвращаете результат от Operation во ViewModel, и Exrin делает все остальное. В примере ниже показывается результат навигации. На этом стеке состоится переход к Main Stack и Main View. Главное в этом стеке — имя View.

 

Вы можете свободно взаимодействовать с NavigationService напрямую путем ввода INavigationService. NavigationService имеет следующее определение.

 

Ключом будет то, что Вы припишите к View в стеке. StackIdentifier — это ключ, который Вы назначили в стеке. Если вы не предоставите StackIdentifier, то будет считаться, что Вы имеете в виду тот же самый стек. Args — это объект, который содержит все, что Вам понадобится передавать к ViewModel.

Exrin заботится о переключении стека и выталкивании или проталкивании views для достижения цели, Вам необязательно знать о том, как добраться до страницы и стека, нужно просто внести запланированную цель.

IStackOptions предназначен для переключения стеков и навигации к странице, но, кроме того, он обеспечивает большую гибкость в том, как его можно использовать. Например, если Вам нужно переключиться на стек, и Вы не знаете в то время, какое View запущено, но Вы не хотите при этом его изменять, то Вы можете просто отправить его через StackChoice, который на самом деле StackIdentifier (приношу свои извинения за несогласованность наименований, я мог бы сформировать критическое изменение по ходу дела).

У Вас также есть возможность загрузить стек с определённым числом предварительно загруженных views. Если вы хотите перейти к view в стеке, но для этого предварительно нужно загрузить несколько views, тогда Вы можете использовать PreDefinedStack, чтобы определить их. Они будут загружены в стек раньше, чем ViewKey. Это происходит в фоновом режиме, так что пользователь не увидит мерцающих страниц.

 

Контейнер View

Последний концепт, который я собираюсь представить, — это View Hierarchy, разработанный специально для таких более сложных views, как MasterDetailPage и TabbedPage. Вы помещаете стек во ViewContainer. В случае с TabbedPages и MasterDetailPages Вы помещаете несколько стеков в контейнер.

В момент осуществления навигации Вы всё ещё выбираете, к какому стеку или странице совершить переход. Exrin обрабатывает все остальное и демонстрирует правильное view.

Эти views немного сложнее, но вы можете ознакомиться с моим Tesla Example, чтобы увидеть MasterDetailPage и TabbedPage в действии.

Автор: Adam Pedley
ИсточникСтатья в блоге автора

Александр Алексеев
Александр Алексеев

Xamarin - разработчик. Работаю с .NET платформой с 2012 года, программирую в основном с использованием C#. За это время успел поработать с ASP.NET, Entity Framework, MSSQL, Git

Распознание лиц
VSTS и HockeyApp

Написать ответ