Flutter. Весеннее обновление 2020

Автор оригинала: Tim Sneath, Patrick Sosinski
  • Перевод
Привет! Меня зовут Евгений Сатуров, я Flutter-разработчик Surf и основатель Flutter Dev Podcast.
Ниже перевод статьи Tim Sneath и Patrick Sosinski с моими комментариями.

Полмиллиона разработчиков, 50 тысяч приложений, взрывной рост и обновлённый релизный цикл.

Последние месяцы были трудными для команды Flutter. Как и многие из вас, наши разработчики, менеджеры по продуктам, специалисты по UX, технические писатели и менеджеры по связям с разработчиками вынуждены заново выстраивать свои будни. Как проект с открытым исходным кодом, мы продолжаем нашу работу, используя общедоступные инструменты. Несмотря на непривычную рабочую обстановку и необходимость заботиться о зависимых членах наших семей, мы стараемся не отставать от намеченного плана. Кроме того, мы узнали много нового о наших пользователях.



Движущая сила Flutter


Как и прежде, мы наблюдаем стремительный рост использования Flutter. За 16 месяцев с момента запуска число разработчиков, использующих Flutter, превысило 2 млн. Несмотря на беспрецедентные обстоятельства, мы заметили 10%-ный рост использования Flutter в марте по сравнению с предыдущими месяцами. Каждый месяц Flutter используют полмиллиона разработчиков.

Другая любопытная статистика:

  • 60% из вас используют Windows, 27% — macOS, и 13% пользуются Linux.
  • 35% из вас работают в стартапе, 26% — разработчики корпоративных приложений, 19% — самозанятые, а 7% работают в дизайн-студиях.
  • 78% Flutter-разработчиков используют канал stable, 11% пользуются beta, а 11% работают с dev или master-каналами.
  • Топ стран, где разрабатывают на Flutter: Индия, Китай, США, страны Европейского Союза, Бразилия.
  • В Play Store было опубликовано около 50 тыс. приложений, написанных на Flutter. Почти 10 тыс. приложений было загружено только за последний месяц.
  • Самые часто используемые библиотеки фреймворка: http, shared preferences, intl, meta, path provider и pedantic.
  • Самые популярные сторонние библиотеки: provider, rxdart, cached network image, sqflite, font awesome flutter и flutter launcher icons.



Комментарий по статистике по операционкам:

Несмотря на значительный перевес в сторону Windows, мы в Surf разрабатываем Flutter-приложения исключительно на macOS. Слишком много ограничений накладывает отсутствие возможности быстро протестировать написанный код на iOS-устройствах. Некоторые операции и вовсе, сделать без macOS невозможно. Думаю, вы точно захотите выгрузить сборку не только в Google Play, что проблематично сделать без Xcode, который, в свою очередь, может быть установлен только на Mac. Да, существуют разные уловки, которые частично помогают решать эти проблемы без финансовых вложений. Советую попробовать плагин Remote Mac от наших друзей из Codemagic. Этот плагин на 20 минут предоставляет доступ к удалённому Mac для любых операций (и всё это бесплатно).

UPD (via tokarev): Доступ к macOS (SSH/VNC) был добавлен и в основной функционал Codemagic.

Комментарий по статистике по используемым каналам:

Пока мы, как и большинство разработчиков, плотно сидим на stable-канале. Он обновляется раз в квартал и это… редко. Хочется чаще получать апдейты и багфиксы. Поэтому, мы всё активнее двигаемся в сторону того, чтобы пробовать пользоваться dev-каналом для разработки на постоянной основе. В одном из выпусков Flutter Dev Podcast Андрей Лесницкий рассказал, что использует dev в качестве основного канала уже давно и это совсем не страшно и не больно. Рекомендуем послушать.

Flutter в корпоративной разработке


Всё больше компаний выбирают Flutter для разработки брендированных продуктов для нескольких платформ. Недавний пример — Nubank, крупнейший цифровой банк за пределами Азии с 20 млн. клиентов. Проанализировав три технологии кроссплатформенной разработки, Nubank остановились на Flutter. Им удалось объединить команду фронтенд-разработчиков в одном фреймворке, что позволило Nubank запускать новый функционал одновременно на iOS и Android.
В этом видео разработчики Nubank рассказывают об опыте использования Flutter и его преимуществах.
Комментарий про продакшн-кейсы:

Ищете больше существующих проектов на Flutter и референсов к известным командам, сделавшим свой выбор в пользу именно этого кроссплатформенного фреймворка? Сразу два выпуска Flutter Dev Podcast помогут вам узнать больше про успешный опыт таких команд-первопроходцев: Яндекс.Такси делают Flutter-приложение для водителей (ссылка на выпуск), а ребята из Grab, после того как вытеснили Uber из юго-восточной Азии, пишут на Flutter проекты для мерчантов и компоненты для супераппа (ссылка на выпуск).
Нам тоже есть чем похвастаться. Рассказ о нашем первом крупном публичном Flutter-проекте на сайте.

Частый запрос от компаний — наличие enterprise-компонентов. Мы начали сотрудничать с SyncFusion, чей продукт Essential Studio теперь включает ряд профессиональных компонентов для Flutter, таких как построение графиков, работа с PDF и генерация штрих-кодов. С релизом версии 2020.1 все компоненты из коробки поддерживают Android, iOS и даже web, а элементы управления получили веб-превью.

Обновлённый релизный цикл


В ожидании следующего запланированного релиза стабильной версии, мы хотим поделиться изменениями в нашей релизной модели. Эти изменения обеспечат стабильность и регулярность наших релизов.

Релизный цикл, которым мы пользуемся сейчас, задумывался как простой и не требующий частого обслуживания. Этот цикл исправно служил Flutter, когда мы были небольшой командой и только начинали над ним работать. Но при наших нынешних масштабах мы столкнулись со сложностями, затрагивающими всех разработчиков Flutter, а именно:

  • отсутствие ясности относительно сроков подготовки релиза и кода, который пойдёт в релиз;
  • отсутствие тестирования веток, приводящее к регрессионным ошибкам hotfix-релизов.

Начиная с апрельского релиза Flutter, мы переходим к модели ветвления кода с периодом стабилизации для beta и stable-версий. Теперь мы будем создавать ветки кода в начале месяца для beta-версии и стабилизировать эту версию, собирая все критические исправления. Примерно раз в квартал текущая beta-ветка будет продвигаться к стабильной версии, и при необходимости мы будем вносить в неё исправления. Так как наша инфраструктура теперь поддерживает тестирование веток, мы можем валидировать собранные исправления и принимать запросы, основываясь на их важности.

Мы воспользовались этой возможностью, чтобы совместить релизные циклы и каналы Flutter и Dart. В результате мы добавили в Dart канал beta, что в будущем позволит нам синхронизировать релизы. Теперь beta-релизы Flutter будут содержать beta-релизы Dart.

Если ваше Flutter-приложение уже работает на базе канала stable, мы рекомендуем протестировать его на beta-канале и таким образом повлиять на качество стабильного релиза. Также вы можете принимать участие в исправлении регрессионных и блокирующих багов в stable-канале", используя новый процесс Flutter Cherrypick, описанный во Flutter Wiki.

Мы считаем, что эти нововведения повлияют на регулярность и качество наших релизов и упростят внесение исправлений в стабильную версию.
Комментарий про новый релизный цикл:

TL;DR Что изменится в жизни Flutter-разработчиков вместе с изменениями релизного цикла? Ничего. Может быть жизнь станет чуточку лучше, а известные баги фреймворка будут быстрее доходить до стабильных каналов. Но периодичность обновления stable-канала раз в квартал не меняется и это немного расстраивает. Впрочем, самые критичные проблемы будут закрываться хотфиксами, как это и происходит сейчас. А вот окончательная синхронизация релизных циклов Dart и Flutter радует: новые фичи языка сразу будут находить своё применение и в самом фреймворке.

Изменения в версионировании


В рамках новой модели ветвления мы внесли несколько незначительных изменений в версионирование.

Полная техническая информация доступна на странице релизных каналов Flutter в Wiki. Приведём краткое описание изменений:
Нестабильные релизные версии получат суффикс .pre в строке версии для обозначения их предрелизного статуса. В строке формата x.y.z-n.m.pre значение n в сборках канала dev будет увеличиваться каждый раз, когда будет создана новая сборка в канале master:

  • 1.18.0–1.0.pre: первая dev сборка после сборки в канале master получает номер 1.18
  • 1.18.0–2.0.pre: следующая dev сборка, основанная на одной из последних сборок в канале master

Бета-релизы будут собираться после релиза в канале dev, как указано выше. С каждым исправлением значение m увеличивается. Например, если мы возьмём 15-ю dev сборку из канала master, вышедшую из беты под номером 1.18, нумерация будет выглядеть так:

  • 1.18.0–15.0.pre: изначальный бета-релиз (тот самый, который отправился в dev)
  • 1.18.0–15.1.pre: последующая сборка в (теперь уже) ветке beta с исправлениями
  • 1.18.0–15.2.pre: вторая, более поздняя сборка

Версии стабильных релизов оформляются как x.y.0. Последующие исправления будут увеличивать номер патча (x.y.1, x.y.2 и т.д.):

  • 1.18.0–15.4.pre: последняя тестовая сборка в ветке
  • 1.18.0: стабильный релиз, то же самое, что версия 1.18.0–15.4.pre
  • 1.18.1: потенциальный патч версии 1.18.0

Комментарий про новое версионирование:
Главное теперь не запутаться во всём этом разнообразии. Мне кажется, что новая система версионирования стала более понятной и простой. По-крайней мере, теперь не нужно никому объяснять, почему последняя и самая стабильная версия фреймворка носит такое странное название v1.12.13+hotfix.9.

Что дальше?


Следующий релиз в канале stable будет использовать новое версионирование. Мы планируем выпустить его на следующей неделе вместе с детальным описанием всех новых функций.

А пока предлагаем ознакомиться с другими нашими новостями. На прошлой неделе мы объявили о том, что платформа CodePen теперь поддерживает Flutter. Мы рады сообщить, что за несколько дней на сайте появилось множество работ, написанных на Flutter. Мы выбрали для вас самые интересные:


Хорошая новость для тех, кто хочет научиться разрабатывать на Flutter: мы запустили бесплатный 10-часовой ознакомительный курс по Flutter. Он включает в себя как учебные пособия, так и лабораторные работы, которые помогут вам начать свой путь в качестве Flutter-разработчика.

Увидимся на следующей неделе. Мы надеемся, что вам удастся добиться ваших целей в это сложное время. Оставайтесь дома и будьте здоровы!
Surf
Компания

Комментарии 13

    +3
    Небольшое уточнение для тех кто не работает на macOS.

    Доступ к macOS (SSH/VNC) был добавлен в основной функционал Codemagic. Теперь это доступно не только для пользователей Visual Studio Code, но и для всех остальных, и не надо заморачиваться с копированием исходников на удаленную машину.
      0
      Спасибо за апдейт! Теперь я и читатели этого поста будем в курсе об этом.
      +1
      Перешел с Xamarin на Flutter и ни могу не нарадоваться. Единственный раздражающий момент, система типов в Dart. Хочется нормальной строгой, явной типизации.
        0
        Так она же есть.
        Если хочется ещё строже, можно «затянуть гайки» на уровне статического анализатора:
        dart.dev/guides/language/analysis-options#enabling-additional-type-checks
          0
          analyzer:
            strong-mode:
              implicit-casts: false
              implicit-dynamic: false

          То что доктор прописал, спасибо
          +1
          Вот пакет мой, Для себя написал, так как сам с .net и привык к строгости
          pub.dev/packages/strict_dart
            0
            Спасибо за исходники, можно с «errors» в yaml побаловаться благодаря Вам.
              0
              Пересоздал пакет теперь он тут pub.dev/packages/strict_analyzer
              +2

              О, а расскажите пожалуйста, что сильнее всего радует при переходе с Xamarin на Flutter?

                +4
                Это довольно обширная тема, да и опыта с Flutter у меня пока не так много. Но если выделить главную для меня положительную черту, то это их подход к имплементации фреймворка. Там где можно работать со Skia, работают с ней. Где нет (веб), транслируют в веб элементы. При этом ты действительно работаешь нативно с UI потому как рендер UI концептуально от платформы к платформе не меняется. Ты оперируешь виджетами везде одинаково.

                Eсли мы говорим про мобильную разработку, Flutter не скрывает от тебя нативные инструменты разработки. Приложение строится благодаря Xcode и gradle а не msbuild. По сути это и есть нативное приложение просто с одним activity/controller и canvas внутри. Xamarin имеет привычку все скрыть и завернуть в фантик от майкософт, что с одной стороны помогает абстрагироваться от платформ, но с другой причиняет боль если ты хочешь выйти чуть дальше этой песочницы.

                Я в основном писал на Xamarin.Native/Classic и с Forms у меня был опыт печальный и очень давно, поэтому как сейчас в Forms дела обстоят я не знаю, но при переходе на Flutter я впервые ощутил, что UI для iOS и Android оказывается можно писать единый. Это наверное главный wow эффект. Это действительно pixel perfect решение и теперь я не знаю как можно вернуться к Xamarin после этого :)

                HotReload/Restart вещь. Я знаю что в Forms вроде тоже реализовали это но имплементация точно будет хуже, просто потому что в конечном счете рендер UI в Xamarin ложится на каждую из платформ отдельно и такого функционала просто нет у них (не считая SwiftUI, но в Xamarin это пока не работает)

                Everything is widget концепт действительно подкупает. Padding это тоже виджет, например. И это действительно так если ты смотришь на это с точки зрения рэндера дерева виджетов. Вообще все эти концепты widget/element tree, stateless и statefull виджетов, вся эта «реактивность» из коробки подкупают и не позволяют мыслить по другому после этого.

                Есть и свои минусы/странности конечно. Например ты не можешь просто взять и узнать размер элемента перед построением всего дерева элементов. Фреймворк просто не работает так. Работа с зависимостями в пакетах (NuGet аналог) тоже далека от идеала. В Xamarin/.NET это реализовано стабильнее, чтоли. Dart и DartVM тоже далеки от идеала. С# как язык на порядок превосходит Dart, по моему мнению. Хотя некоторые концепты очень хорошо вписываются во Frontend разработку. Например в DartVM есть такой концепт как isolate. Каждый isolate это один main thread, побочные IO «трэды», которые дают тебе асинхронность и своя изолированная куча. Все. В этой песочнице ты и работаешь. Нужно что-то параллельно сделать, можно создать другой isolate и общаться с ним посредством сообщений но у меня такой необходимости пока не возникало да и на вряд ли возникнет.

                PS: сейчас я разрабатываю одно приложение на Flutter с очень продвинутой анимацией и честно, я просто не был бы в состоянии сделать что-то подобное на Xamarin в каких-то приемлемых сроках. Нативно, скорее всего да если ты супер спец сразу на 2 платформы. На Xamarin.Forms, очень сомневаюсь, возможно если ты используешь SkiaSharp и то не факт. В общем, c Flutter моя продуктивность возросла.
                  0
                  Интересно написал. Это практически тема для новой статьи)
                    +1
                    Я, собственно, и начал писать статью) Надеюсь на выходных закончу
              +2
              Читал заметку голосом Евгения из подкаста. Спасибо за подкаст

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое