Черновик этой заметки был написан еще в июле, но по непонятным причинам забыт/отложен/отправлен на доработку. В свете свежеприобретенного опыта, я решил таки достать его из запасников истории и представить на свет божий :)
Меньше месяца назад, в июне 2014-го (да, заметка писалась еще в июле :)) ребята из Xamarin выпустили то самое, что от них ожидалось очень давно. Это — фреймворк для построения кроссплатформенного UI — Xamarin.Forms.
Такое решение — золотая середина между html-подобным интерфейсом, который выглядит ненативно на всех платформах, зато обладает на 100% общим кодом; и изначальным подходом Xamarin — где UI на каждой платформе полностью уникальный, отлично и естественно смотрится на всех устройствах, но требует разработки «с нуля» под каждую платформу.
Идея Xamarin.Forms в том, что многие базовые контролы пользовательского интерфейса так или иначе реализованы во всех системах (поддерживаются iOS/Android/WinPhone). Действительно, кнопки, надписи, поля ввода и переключатели есть везде. Xamarin выделил этот общий набор, собрал воедино все их свойства, и назвал эту абстракцию Xamarin.Forms. Из получившихся платформо-независимых классов можно строить интерфейс, а в результате под каждую платформу будет сгенерирован вполне естественный нативный UI с использованием «родных» компонентов.
Делать обзор функционала Forms через 5 месяцев после релиза слегка глуповато, так что я просто остановлюсь на некоторых плюсах и минусах, с которыми я успел столкнуться в процессе полу-продакшеновой практической эксплуатации Xamarin.Forms.
Впрочем, даже если бы я задался целью выдать подробное русскоязычное руководство, я наврядли смог бы сказать больше, чем уже сказано в достаточно подробной документации Xamarin’a (на удивление, документация действительно полезна и довольно-таки полна, что слегка нетипично для Xamarin). Еще более удивительно, что типичные страницы описания классов (которые всегда были бесполезны чуть менее, чем полностью), на этот раз содержат примеры, которые очень даже покрывают базовые случаи. Я просто оставлю здесь ссылку на описание класса Grid, чтобы вы сами смогли оценить эту полезность.
От документации перейдем к самому важному: в чем же плюсы и минусы Xamarin.Forms? Мой взгляд, конечно, субъективен, но всё же.
Плюсы:
- Простые интерфейсы действительно легко сделать кроссплатформенными
- Есть XAML-подобный синтаксис, так что теоретически в больших проектах возможно разделение работы между верстальщиками и программистами (практически же пока советуют создавать интерфейсы в коде)
- За счет CustomRenderer‘ов стандартные контролы легко дополняются произвольными свойствами (например, сделать градиентную заливку кнопок — дело пары минут, хотя «из коробки» это не работает)
- Xamarin.Forms.Labs — отличный проект со многими контролами, отсутствующими в стандартной поставке Forms
- Динамическая верстка для iOS в бесконечное число раз проще, чем использование constraints вручную
- MVVM-байндинги «из коробки» (но при желании можно и продолжать использовать полюбившийся MVVMCross)
Минусы:
- CustomRenderer’ы хоть и хороши, но на данном этапе их приходится использовать уж очень часто (== многие базовые вещи, например, градиентная заливка или цвет границ, отсутствуют «из коробки»)
- Реализованы далеко не все контролы (например, отсутствует UICollectionView, хотя мне кажется, он есть на всех платформах)
- Android страницы невозможно расположить как часть уже существующего Activity/Fragment (в отличие от iOS, где на выходе Page.CreateViewController() мы получаем обычный UIViewController и вольны использовать и интегрировать его .View куда и как захотим.
- Сложные жесты и анимации в Xamarin.Forms пока вписываются не очень хорошо (приходится реализовывать отдельно под каждой платформой)
- Не поддерживается Win8/WPF. Хотя неофициальный пакет Xamarin.Forms.Platform.WinRT уже появился в nuget, что даёт некоторую надежду :)
В целом, Xamarin.Forms не идеален (как и следовало ожидать), но для начала/прототипирования простых приложений существующих возможностей должно вполне хватить. Более того, даже для приложений, выросших из стадии прототипа, Xamarin.Forms вполне может служить удобной основой, части которой постепенно заменяются «более нативными» элементами.
Еще одним удобным вариантом использования может стать верстка отдельных шаблонных экранов на Xamarin.Forms — такой сценарий отлично поддерживается, и для того чтобы начать использовать Forms вовсе нет необходимости переписывать на нём всё приложение. Хорошим примером таких экранов могут служить страницы настроек и заполнения форм — выглядят они довольно стандартно и могут быть легко сверстаны «кроссплатформенно».
Комбинируя же Xamarin.Forms с другими кроссплатформенными библиотеками и контролами из Component Store вполне можно создать адекватное мобильное приложение со 100% общего кода (и 0% платформо-зависимого).
В итоге, всем, занимающимся мобильной разработкой, я крайне рекомендую обратить внимание на Xamarin.Forms. Знание его возможностей и плюсов обязательно поможет вам при проработке/оценке новых проектов и кое-где даст заметный выигрыш в time-to-market.
1 комментарий