Сегодня мы с радостью объявляем о релизе Flutter 2.0 С тех пор, как вышел Flutter 1.0, прошло чуть больше двух лет. За этот короткий срок мы внесли 24 541 исправлений и смёрджили 17 039 пул-реквестов от 765 членов сообщества. Отдельное спасибо нашим волонтёрам за то, что щедро тратят своё свободное время на улучшение Flutter. Flutter – самое настоящее коллективное детище, и мы бы не добрались до второй версии без тех, кто сообщал нам о проблемах, отправлял пул-реквесты и проверял код. Этот релиз посвящается всем вам.
Что нового появилось во Flutter 2
Web
Поддержка Flutter for Web доступна в stable-канале. Начиная с первого стабильного релиза, Flutter выводит переиспользование кода на новый уровень благодаря поддержке web-платформы. Теперь, когда вы создаёте приложение на стабильном канале Flutter, его целевой платформой может стать и web.
Moi Mobiili — современный виртуальный оператор связи. Он стремится к высоким стандартам качества с помощью цифровых технологий. Для мобильного приложения с личным кабинетом оператор выбрал Flutter. Недавно Moi Mobiili запустил и web-приложение
Использовав множество сильных сторон web-платформы, Flutter заложил основу для многофункциональных интерактивных web-приложений. В первую очередь мы сосредоточились на производительности и улучшении качества визуализации. Помимо имевшегося HTML рендеринга, мы добавили новый механизм рендеринга на основе CanvasKit. Также мы добавили характерные для web фичи. Например, Link widget — чтобы запущенное в браузере приложение по ощущениям было похожим на web-приложения.
Более подробно о стабильном релизе можно почитать в посте о поддержке Flutter for Web.
Sound Null Safety
Sound null safety – существенное дополнение к языку Dart, которое ещё сильнее укрепляет систему типов: типы, допускающие значение Null, отделяются от не допускающих. Благодаря этому разработчики смогут избежать крашей при обращении к Null — частой причины крашей в приложении.
Проверка на Null внедрена в систему типов, поэтому такие ошибки можно обнаружить ещё в процессе разработки — а значит, избежать крашей после выхода в продакшн. Sound null safety полностью поддерживается стабильными версиями — начиная с Flutter 2, где используется Dart 2.12. Более подробно об этом можно почитать в посте о Dart 2.12.
В репозитории пакетов pub.dev уже опубликовано более тысячи null safe пакетов, включая сотни пакетов от команд Dart, Flutter, Firebase и Material. Если вы автор пакета, прочитайте руководство по миграции и рассмотрите возможность миграции.
ПК
Мы рады объявить, что поддержка Flutter for Desktop доступна в стабильном канале с возможностью раннего доступа. Это значит, что вы уже можете опробовать платформу в качестве целевой для своих приложений во Flutter. Представьте, что это «бета-превью», где можно посмотреть, как будет выглядеть финальный стабильный релиз. Он должен выйти чуть позже в этом году.
Чтобы добиться высокого качества Flutter для ПК мы вносили в него как масштабные, так и небольшие изменения. Сначала мы постарались, чтобы редактирование текста работало, как в нативной среде на каждой из поддерживаемых платформ, включая такие основополагающие фичи, как выделение текста и возможность прервать передачу уже обработанных событий клавиатуры. Что касается работы с мышью, перетаскивание манипулятором теперь начинается сразу, без задержки, необходимой при работе с тачскрином.
Также мы добавили встроенное контекстное меню в виджеты TextField и TextFormField для языков Material и Cupertino. И наконец, виджет ReorderableListView теперь дополнен фичей grab handle.
В ReorderableListView теперь есть возможность без труда перетаскивать объекты мышью.
ReorderableListView всегда отлично передвигал объекты по экрану без особых усилий со стороны разработчика, но, чтобы перетащить объект, пользователю приходилось выбирать его долгим нажатием. В этом был смысл на мобильном устройстве, но мало кому из пользователей ПК придёт в голову использовать долгое нажатие, прежде чем двигать предмет. В этом релизе есть фича grab handle, которая подходит как для мыши, так и для тачпада. Ещё одно улучшение нативной функциональности – обновлённый скроллбар: теперь он отображается корректно на десктопе.
В этом релизе обновлён виджет Scrollbar – теперь он отлично работает в среде ПК.
Виджет Scrollbar теперь дополнен интерактивными фичами, характерными для ПК. В том числе появилась возможностью перетаскивать бегунок, кликать по скроллбару, чтобы переместиться вниз или вверх по странице, а также отображать скроллбар, когда указатель мыши находится над любой его частью. Кроме того, с помощью нового класса ScrollbarTheme можно подстроить внешний вид виджета Scrollbar под приложение.
Чтобы ещё больше приблизиться к функциональности ПК, мы включили в релиз возможность управлять аргументами командной строки в приложениях Flutter. Таким образом, простым двойным щелчком по файлу в проводнике Windows можно открыть его в приложении.
Также мы приложили много усилий, чтобы размер окон менялся плавнее как на Windows, так и на macOS, а пользователи из разных стран могли использовать IME (редакторы методов ввода).
Теперь Flutter для ПК поддерживает интуитивный IME ввод:
Также мы обновили доки о том, с чего начать подготовку своего приложения для ПК к размещению в сторах соответствующих ОС. Попробуйте и обязательно напишите, если мы что-то упустили.
Чтобы перейти на бета-версию Flutter for Desktop, переключитесь на бета-канал и отметьте в настройках ваши целевые платформы, согласно инструкциям на flutter.dev.
Ещё мы сделали снапшот бета-фич, доступный на стабильном канале. Опробовать Flutter for Desktop можно, не переключаясь на бета-канал: разблокируйте поддержку интеграции с помощью ‘flutter config’ (например, при помощи флага enable-macos-desktop). Это избавит вас от необходимости тратить время на переключение на бета-канал, затягивание последней версии Flutter SDK, компиляцию инструментов и.т.д. Такой вариант отлично подходит для первого раза или если вы используете ПК версию в качестве простого «эмулятора Flutter».
Однако, если вы решили получить доступ к бета-версии для ПК и остаться на стабильном канале, вы не сможете получать новые фичи и исправления багов так же быстро, как на бета-канале или канале для разработчиков. Так что если вы активно работаете с Windows, macOS или Linux, рекомендуем переключиться на канал, где обновления происходят быстрее.
Близится первый релиз Flutter для ПК, полностью готовый для коммерческого использования, и мы знаем, что нам ещё многое предстоит сделать. В том числе — добавить поддержку интеграции с нативными меню верхнего уровня, сделать редактирование текста более нативным для разных платформ, включить поддержку специальных возможностей, пофиксить разные баги и улучшить производительность. Если вы знаете, что ещё нужно сделать до выхода ПК-версии в продакшн, обязательно напишите нам.
Адаптивность приложений под платформу: Flutter Folio Sample
Flutter поддерживает три платформы для приложений в продакшн (Android, iOS и web) и ещё три в бета-версии (Windows, macOS и Linux). Возникает логичный вопрос: как написать приложение, чтобы оно хорошо адаптировалось под несколько разных форм-факторов (маленький, средний и большой экран), разные способы ввода (тачскрин, клавиатура и мышь) и разные идиомы (мобильных, веб и десктопных приложений)? Чтобы ответить на этот вопрос, мы запустили приложение для скрапбукинга Flutter Folio.
Видео по ссылке
Анонс нового приложения Flutter Folio
Мы создали Folio как простой пример приложения, которое должно хорошо работать на нескольких платформах с одним исходных кодом. И под «хорошо» имеется в виду, что оно хорошо выглядит на маленьком, среднем и большом экранах, позволяет пользоваться тачскрином, клавиатурой и мышью, а также хорошо взаимодействует с идиомами платформы (к примеру, в нём можно переходить по ссылке в web-версии и открывать меню на ПК). Такие приложения мы называем «адаптивными», потому что они хорошо адаптируются под любую платформу, на которой их запускают.
Если вы хотите узнать, как сделать свои приложения адаптивными, посмотрите исходный код Folio. В будущем можно будет найти более подробные документы и кодлабы. А пока можете ознакомиться с великолепными постом и видео от Алоис Дениэл.
Бета-версия Google Mobile Ads
Помимо перехода Flutter для ПК в бета-версию, мы рады сообщить о выходе открытой бета-версии Google Mobile Ads SDK для Flutter. Это абсолютно новый плагин, который может вставлять встроенные баннеры и нативную рекламу в дополнение к уже существующим форматам оверлеев (оверлейные баннеры, промежуточные страницы и видео с вознаграждением). В этом плагине объединена поддержка Ad Manager и Admob, так что его можно подогнать под ваш сценарий независимо от масштабности вашего бизнеса.
Google Mobile Ads SDK для Flutter
Оверлейный баннер | Встроенный баннер | Промежуточная страница | Видео с вознаграждением | Нативная реклама |
Мы уже опробовали этот плагин с некоторыми из своих первых клиентов в закрытой бета-программе, и многие из них успешно запустили приложения с новыми форматами рекламы. К примеру, Sua Musica (крупнейшая латиноамериканская музыкальная платформа, на которой зарегистрировано более 15 тысяч независимых музыкантов, а число ежемесячных активных пользователей составляет 10 млн) запустили новое приложение на Flutter с плагином Google Mobile Ads SDK для Flutter. Их показы увеличились на 350%, CTR вырос на 43%, а eCPM – на 13%.
Вы можете воспользоваться этим плагином уже сегодня. В рамках Flutter Engage, Эндрю Брогдон и Зоуи Фэн поговорили о «Монетизации приложений во Flutter» (видео доступно на странице Flutter Engage). Они обсудили стратегии монетизации для Flutter-приложений и способы внедрения рекламы в них.
На странице Ads на flutter.dev мы собрали все полезные ресурсы: например гайд по плагину, кодлаб о встроенных баннерах и нативной рекламе и кодлаб об оверлейных баннерах, промежуточных страницах и видео с вознаграждением. Обязательно их посмотрите!
Новые фичи в iOS
Не подумайте, что раз мы повышаем качество поддержки на других платформах, то забыли про iOS. В этом релизе мы смёрджили 178 пул-реквестов, связанных с iOS: добавили восстановление состояния; возможность собирать IPA непосредственно из командной строки, не открывая Xcode; обновили CocoaPods до версии, которая работает с новейшими инструментами. Кроме того, мы добавили несколько виджетов iOS для реализации дизайна с Cupertino.
С помощью нового CupertinoSearchTextField можно реализовать UI поисковой строки iOS.
С виджетами CupertinoFormSection, CupertinoFormRowиCupertinoTextFormFieldRow легче создавать поля формы, органичные для секционной визуальной эстетики iOS.
Помимо работы над фичами в iOS, мы продолжаем изучать, как можно улучшить производительность для iOS и Flutter в целом при работе с шейдерами и анимацией. iOS остаётся основной платформой для Flutter, и мы продолжим внедрять важные фичи и улучшать производительность.
Новые виджеты: автозаполнение и ScaffoldMessenger
В этом релизе мы дополнили Flutter двумя новыми виджетами: AutocompleteCore и ScaffoldMessenger. AutocompleteCore представляет собой минимальную функциональность, с помощью которой можно реализовать автозаполнение в приложении во Flutter.
Этот виджет можно использовать уже сейчас.Если вам интересно посмотреть дизайн полной фичи, почитайте документацию по дизайну автозаполнения.
Аналогичным образом ScaffoldMessenger решает ряд проблем, связанных со SnackBar. Теперь можно без труда создавать SnackBar в ответ на действие AppBar, сохранять состояние SnackBar при переходе между Scaffold, показывать SnackBar по завершении асинхронного действия, даже если пользователь перешел на страницу с другим Scaffold.
Всю эту красоту можно заполучить за пару строк кода:
final messenger = ScaffoldMessenger.of(context);
messenger.showSnackBar(SnackBar(content: Text(‘I can fly.’)));
Однако виджет не так прост, как кажется. Более подробно о ScaffoldMessenger можно узнать из великолепного видео Кейт Лаветт.
Использование нескольких инстансов Flutter с Add-to-App
Из разговоров с Flutter-разработчиками мы узнали, что у многих нет возможности создать приложение с нуля. Но есть возможность добавить Flutter в уже существующие iOS- и Android-приложения. Новая фича под названием Add-to-App – отличный способ переиспользовать код во Flutter на обеих мобильных платформах, сохранив при этом уже имеющийся нативный код.
Мы слышали, что в таком случае разработчикам не всегда понятно, как интегрировать во Flutter больше одного экрана. Когда экраны на Flutter и нативные экраны идут вперемешку, тяжело сохранить текущее состояние навигации, а интеграция нескольких инстансов Flutter на уровень view требует много памяти.
Раньше расход статической оперативной памяти на первый и все последующие инстансы был одинаковым. Во Flutter 2 мы сократили расход памяти на дополнительные компоненты Flutter на ~99% — до ~180kB для каждого инстанса.
Новые API, с помощью которых это можно сделать, сейчас есть в превью на бета-канале. Документацию вместе с примерами проектов ищите на flutter.dev.
Так что теперь мы, не раздумывая, рекомендуем вам создавать несколько инстансов Flutter в нативном приложении.
Flutter Fix
Когда у фреймворка появляется больше пользователей и разрастается исходный код, разработчики стараются не вносить изменения в API фреймворка. Важно не нарушить обратную совместимость постоянно растущего числа строк кода.
Flutter 2 совсем скоро окажется в этой ситуации: количество поддерживаемых платформ растёт, и число Flutter разработчиков уже перевалило за 500 тысяч.
Однако, чтобы и дальше совершенствовать Flutter, нам нужна возможность вносить в API изменения без обратной совместимости. Так перед нами встаёт вопрос: как нам и дальше развивать Flutter API, не мешая разработчикам?
Наш ответ – Flutter Fix.
Flutter Fix – комплексное решение. Во-первых, это команда под названием dart fix для командной строки в dart CLI. Она знает, где искать список устаревших API и как обновить использующий их код. Во-вторых, это перечень доступных фиксов, который поддерживается Flutter SDK, начиная с версии 2. И наконец, это дополненный набор расширений Flutter для VS Code, IntelliJ и Android Studio IDEs, которые тоже отображают перечень доступных фиксов в виде quick fix-ов c иконками лампочек. С их помощью внести изменения в код можно одним кликом мыши.
Приведу пример. Скажем, в вашем приложении есть вот такая строка кода:
Создаём виджет во Flutter с помощью устаревшего аргумента. Так как аргумент в этом конструкторе устарел, его нужно заменить:
Даже если вам известны все устаревшие элементы Flutter, чем больше изменений нужно внести в код, тем сложнее становится его отладить и тем легче ошибиться. Люди не очень хорошо справляются с такой монотонной работой. А компьютеры – наоборот. Выбрав следующую опцию, можно посмотреть все известные нам фиксы, доступные в проекте:
$ dart fix --dry-run
Если вы хотите пофиксить всё разом, это легко можно сделать со следующей опцией:
$ dart fix --apply
Или, если вам хочется посмотреть все фиксы и подтвердить их по отдельности в своей любимой среде разработки, такая возможность тоже есть.
Мы уже несколько лет помечаем устаревшие API. Теперь у нас появилась политика о том, когда следует удалять устаревшие API. Во Flutter 2 мы впервые её применили. Пока во Flutter Fix ещё нет данных обо всех устаревших API. Мы продолжаем добавлять туда информацию и продолжим это делать в будущем. Наша цель – максимально улучшить Flutter API, сохраняя актуальность вашего кода.
Расширение для Android Studio/IntelliJ
Плагин Flutter для среды разработки IntelliJ тоже получил много новых фич. Во-первых, появился новый визард проектов — в том же стиле, что и визард в IntelliJ.
Если вы хотите использовать IntelliJ или Android Studio на Linux, чтобы писать во Flutter SDK, установленном из Snap Store, путь к Flutter теперь добавлен в список известных путей SDK. Пользователям Flutter snap станет проще менять конфигурации Flutter SDK в настройках. За этот контрибьют огромное спасибо MarcusTomlinson@!
Расширение для Visual Studio Code
Расширение для Flutter в Visual Studio Code мы тоже улучшили: появилось больше возможностей для тестирования, в том числе возможность перезапустить тесты сразу после падения.
Изменения без обратной совместимости
Во Flutter 2 мы внесли следующие изменения без обратной совместимости, многие из которых можно автоматически обнаружить и пофиксить с помощью команды dart fix или quick fix-ов в вашем IDE:
- 61366 Продолжили работать над изменением без обратной связи в clipBehavior
- 66700 Установили дефолтное значение clipBehavior в FittedBox на none
- 68905 Удалили параметр nullOk из Cupertino color resolution APIs
- 69808 Удалили nullOk из Scaffold.of и ScaffoldMessenger.of, создали maybeOf для обоих
- 68910 Удалили параметр nullOk из Router.of и сделали так, чтобы возвращалось a non-nullable value
- 68911 Добавили maybeLocaleOf к Localizations
- 68736 Удалили nullOK в Media.queryOf
- 68917 Удалили параметр nullOk из Focus.of, FocusTraversalOrder.of и FocusTraversalGroup.of
- 68921 Удалили параметр nullOk из Shortcuts.of, Actions.find и Actions.handler
- 68925 Удалили параметр nullOk из AnimatedList.of и SliverAnimatedList.of
- 69620 Удалили устаревшие методы из BuildContex
- 70726 Удалили параметр nullOk из Navigator.of и add Navigator.maybeOft
- 72017 Удалили устаревший CupertinoTextThemeData.brightness
- 72395 Удалили устаревший [PointerEnterEvent, PointerExitEvent].fromHoverEvent
- 72532 Удалили устаревший showDialog.child
- 72890 Удалили устаревший Scaffold.resizeToAvoidBottomPadding
- 72893 Удалили устаревший WidgetsBinding.[deferFirstFrameReport, allowFirstFrameReport]
- 72901 Удалили устаревший StatefulElement.inheritFromElement
- 72903 Удалили устаревшие методы Element
- 73604 Удалили устаревший CupertinoDialog
- 73745 Удалили устаревший actionsForegroundColor из Cupertino[Sliver]NavigationBar
- 73746 Удалили устаревший ButtonTheme.bar
- 73747 Удалили устаревший span
- 73748 Удалили устаревший RenderView.scheduleInitialFrame
- 73749 Удалили устаревший Layer.findAll
- 75657 Удалили рудиментарный параметр nullOk из Localizations.localeOf
- 74680 Удалили nullOk из Actions.invoke, add Actions.maybeInvoke
Заключение
Команда Flutter в Google благодарит вас. Мы говорим вам 150 тысяч «спасибо» за более чем 150 тысяч приложений на Flutter, запущенных в сообществе только за последние два года. Из нескольких особенно понравившихся нам приложений мы сделали подборку. Вы найдёте её во вступлении к Flutter Engage в видео, посвященном вам, нашему сообществу.
Без вашей постоянной поддержки и интереса к нашему общему делу мы бы не смогли стать одним из ярчайших международных сообществ разработчиков во всём мире. Нам уже не терпится посмотреть на ваши будущие проекты на Flutter.