Кроссплатформенная разработка - что выбрать?
Если бы меня несколько лет назад спросили про кроссплатформенную разработку мобильных приложений, то никаких лестных слов у меня бы про нее не нашлось - я был молод, неопытен и полон энтузиазма, "Только нейтив, только хардкор!" - таков был мой лозунг. Но годы идут, взгляды меняются, а цензурные выражения в отношении Android иссякают. В голову начали закрадываться мысли: можно ли писать под обе платформы одновременно, при этом получать результат быстрее, чем по-отдельности и не обречь себя на вечные муки в будущем? Ко всему прочему назрела необходимость сделать несколько простых приложений.
Исходные условия
- нужно быстро делать mvp (minimum viable product) под Android и iOS
- есть опыт разработки под Android
- под iOS опыт отсутствует
- нет мака
- немного практики в C# и js
Кандидаты
Выбирал из того, что было на слуху, по популярности и наличию опыта:
- Kotlin Multiplatform
- React Native
- Xamarin
- Flutter
Но еще до анализа вариантов не покидало ощущение, что react и xamarin пойдут лесом.
Отличия
Если отбросить все второстепенные факторы, такие как язык, коммьюнити, сторонние библиотеки, хвалебные/гневные обзоры и т.д. то, на мой взгляд, останется единственная вещь, отличающая один фреймворк от другого - подход к отрисовке UI.
- Коtlin Multiplatform - по сути это не фреймворк, а SDK, с помощью которого можно вынести общий код в платформонезависимую библиотеку, задача UI решается на каждой платформе отдельно.
- React и Xamarin используют обертки над нативными элементами ОС
- Flutter реализует собственный механизм рендеринга без привязки к платформе
Выбор
Не Kotlin( Kotlin Multiplatform - наиболее перспективный подход к кроссплатформенной разработке, но к сожалению, этот вариант пришлось отбросить ввиду отсутствия макбука и времени верстать под разные платформы по отдельности. Оставлю этот вариант на будущее.
Не React и Xamarin - с этими двумя расстаюсь без сожаления, C# - не самый мой любимый язык, а про js и говорить нечего. Xamarin теряет популярность, а реакт был создан фейсбуком, на нем, собственно, и написано мобильное приложение Facebook, при виде которого начинаешь плакать кровью.
Но главное - это рендеринг. При добавлении UI-элемента нужно помнить, что он отрисуется системнозависимым способом, с использованием нативных контролов - не получится полностью абстрагироваться от платформы, придется тратить больше времени на отрисовку и тестирование UI, а если потребуется сделать какой-нибудь кастомный контрол, есть риск столкнуться с существенными трудностями. На стадии mvp хочется ограничиться минимумом усилий, а не вот это все.
Flutter. Каких-то иллюзий относительно этого фреймворка я не питаю - технология относительно новая, репозиторий кишит багами, Dart по сравнению с Kotlin - шаг в прошлое, но с независимым рендерингом можно не париться о платформенных вещах, а следовательно делать приложения быстрее. Поэтому я пока что остановился на этом варианте.
Flutter + Kotlin
Такая связка выглядит наиблее многообещающе - на стадии mvp можно по-быстрому сделать UI на flutter, а логику на Kotlin Multiplatform, если выстреливает - набрать людей в команду, запилить нативные интерфейсы, при этом большая часть кодовой базы остается платформонезависимой и продолжает развиваться.
Данный подход в каком-то виде можно реализовать уже сейчас - через Flutter Platform Channels, но процесс настройки проекта далек от тривиального. С моим нулевым опытом в Dart/Flutter я не рискнул идти по этому пути до поры до времени.
В идеале хотелось бы иметь возможность собрать Kotlin-модуль с возможностью прямого использования из Flutter, думаю, рано или поздно такая штука появится. А может JetBrains создаст свой аналог flutter с преферансом и распутными женщинами, кто знает?