Те из вас, кому приходилось разрабатывать приложения как для Android, так и для iOS, знают, как тяжело работать с двумя базами кода на двух разных языках (четырьмя, если считать Objective-C и Java). Входит Флаттер. Я впервые узнал о Flutter после того, как рассмотрел вопрос о миграции нашего радио-приложения для социальной музыки с Swift на React Native и спросил у разных друзей, которые изменили свое мнение. Реакция была смешанной, если не сказать больше. Я все время слышал о проблемах производительности, из-за которых я нервничал, чтобы сделать ход, несмотря на удобство кроссплатформенности. Один из моих друзей посоветовал мне попробовать Flutter, и с тех пор я уже подсел. Я не могу сказать, что Flutter - идеальное кроссплатформенное решение, но это близко.

За два года, прошедшие с тех пор, как я научился программировать, я создал множество вещей на Python, Swift, Go, Kotlin, а теперь на языке Flutter под названием Dart, и я скажу, что Dart быстро стал моим любимым языком. Его синтаксис читабелен и знаком (похож на Java и Kotlin) и работает как JIT (Just-In-Time), так и AOT (Ahead-of-Time). Он также статически типизирован со всеми преимуществами типобезопасности, но также достаточно гибок, чтобы использовать динамический тип, который может содержать любой тип во время выполнения. Мне нравится эта функция, потому что она дает вам скорость Python для быстрого написания кода, но затем безопасность и производительность статически типизированных языков, когда вы готовы к компиляции в производственную среду. Это все равно что переключаться между Python и Go только на одном языке.

Если вы собираетесь переключиться на Flutter, обратите внимание на несколько вещей:

  1. Скорость. Это, вероятно, самое большое преимущество Flutter. Я перестроил весь интерфейс социального радио Chromatic с нуля, в одиночку, менее чем за 4 месяца. Это безумие, учитывая, что я занимаюсь разработкой всего 2 года. Я здесь не совсем вундеркинд-программист. Тот же самый набор функций занял около года в Swift с разработчиком, который был на много лет старше меня.
  2. Абстракция. Старый собственный код Swift состоял примерно из 16 тыс. строк кода. Тот же набор функций во Flutter / Dart теперь составляет около 6 КБ. Это почти 1/3 исходного кода, выполняющего то же самое. При использовании Swift вам придется беспокоиться о делегировании, утомительных навигаторах и причудливых, часто не интуитивно понятных соглашениях об именах классов. Flutter абстрагирует все это. То, что потребовало бы 50–100 строк кода для создания представлений таблиц, ячеек, делегатов и источников данных для простого просмотра списка с прокруткой, теперь можно сделать с помощью всего нескольких строк с помощью виджетов Flutter. Вам нужно гамбургер-меню? Без проблем. В одной строке виджет Drawer обрабатывает все это за вас, а с несколькими виджетами ListView вы запускаете за 15 минут и дюжину строк кода.
  3. Кросс-платформенность. Вышеупомянутое было бы достаточно впечатляющим, если бы оно просто заменило собственный код iOS, но это еще не все. Мы добавили целое приложение для Android с паритетом функций с использованием той же точной базы кода, что фактически удвоило доступный размер рынка компании. Снова все за 4 месяца разработки.
  4. Компиляция JIT + AOT: когда вы находитесь в разработке, Dart работает в режиме JIT, который позволяет выполнять «горячую перезагрузку» и «горячее обновление». Это эффективно, как обновление браузера только в симуляторе или на вашем устройстве. Если вы знаете, что перекомпилировать приложение в Xcode и ждать несколько минут каждый раз, когда вы вносите незначительные изменения, то вы знаете, насколько это огромно. Честно говоря, это сделало кодирование похожим на рисование или создание музыки. Не нравится там эта кнопка? Внесите изменения, обновите, и почти мгновенно он будет обновлен и доступен. Это позволяет вам больше экспериментировать, что в целом делает создание вещей более похожими на искусство, а не на грубую силу.
  5. Открытый исходный код: мне особенно неприятна документация Apple, поэтому я постоянно сталкивался с препятствиями, из-за которых я произносил довольно много четырехбуквенных слов. Поскольку Flutter имеет открытый исходный код, просто откройте виджет или класс, который вы используете, и сразу увидите полное определение. Вдобавок ко всему их основной SDK содержит лучшую документацию, которую я когда-либо видел в разработке программного обеспечения.
  6. Плагины сообщества. Для вещей, которых нет в основном SDK Flutter, существует Pub.dev, репозиторий плагинов / зависимостей, разработанный сообществом Flutter. Эти плагины охватывают весь спектр от аудиоплееров до виджетов векторной анимации и покупки приложений, все из которых, хотя и являются новыми и все еще находятся в разработке, работают очень хорошо с минимальными изменениями. Я использовал плагин Audio Players, который отлично работал для потоковой передачи http как на Android, так и на iOS из коробки.
  7. Нативная коммуникация канала метода: именно это на самом деле заставило меня нажать на курок, чтобы перейти к Flutter. Когда ничего не помогает, вы можете использовать виджет MethodChannel, чтобы открыть канал связи и вызвать функции в собственных файлах Android или iOS. Этот процесс на удивление прост в настройке, поэтому для всего, что абсолютно необходимо, это предотвращает возникновение узких мест из-за того, что не покрывает Flutter SDK и плагины Pub.dev.

Теперь о проблемах:

  1. Совершенно новая. Стабильная версия 1.0 была выпущена только в декабре 2018 года, то есть на момент написания этой статьи это было 8 месяцев назад. Это означает, что сообщество все еще относительно невелико, а разработчики, знающие Flutter / Dart, редки. Я принял это, поскольку считаю, что отличная документация и сходство с языками на основе Java делают его достаточно легким для изучения, а раннее освоение развивающегося языка имеет ряд преимуществ.
  2. Google имеет тенденцию прекращать выпуск продуктов. Это то, за что Google заработал такую ​​репутацию, что есть сайт, посвященный этому. Этот риск был для меня терпимым, потому что Flutter был открытым исходным кодом, поэтому закрытие - это практически минимальная проблема.
  3. У него есть ограничения функций: эта часть меня больше всего беспокоила. У меня было два убийственных требования: поддержка подписки на оплату приложений и аудиоплеер, поддерживающий потоковую передачу по протоколу http. Два плагина сообщества справились с этими требованиями с минимальными усилиями. Были некоторые ошибки, которые нужно было исправить, как и ожидалось, но поскольку плагины, а также SDK имеют открытый исходный код, было довольно просто диагностировать проблемы.
  4. Журналы неоднозначных ошибок. До сих пор это было моим самым большим раздражением во Flutter. В python и многих других языках журналы ошибок указывают на конкретную строку кода, в которой происходит сбой вашего кода. Не здесь. Журналы ошибок в лучшем случае неоднозначны, а иногда и вводят в заблуждение. В результате отладка - самая болезненная часть разработки Flutter. Точки останова - определенно ваш лучший друг в этом отделе.

В целом, по моему краткому опыту работы с Flutter, резко возросшая скорость разработки, уменьшение размера кода, открытый исходный код и интуитивность Dart делают недостатки Flutter достойными риска для приложений, ориентированных на потребителя.