Услуги Портфолио Контакты БлогНовости +7 (800) 302‑79‑27 Обсудить проект
Облако

Вышел Flutter 3.50 с Dart 3.14: дизайн-библиотеки вынесены из SDK, нативный interop стал стабильным

12 ноября 2026·5 мин чтения
Flutter 3.50Кроссплатформенная разработка
Вышел Flutter 3.50 с Dart 3.14: дизайн-библиотеки вынесены из SDK, нативный interop стал стабильным

Google выпустила Flutter 3.50 вместе с Dart 3.14. Главное для команд: встроенные библиотеки Material и Cupertino официально объявлены устаревшими и переезжают в отдельные пакеты material_ui и cupertino_ui, генераторы FFIgen и JNIgen для прямых вызовов Objective-C, Java и Kotlin стали стабильными, а Android-тулчейн по умолчанию переведён на AGP 9 и API 36.

Релиз и анонс вышли 11 ноября 2026 года. Старый код продолжает собираться, но анализатор уже показывает предупреждения об устаревших импортах, а удаление встроенных библиотек запланировано на один из следующих релизов. Если ваша разработка мобильных приложений построена на одной кодовой базе под iOS и Android, миграцию лучше спланировать сейчас, а не в момент, когда сборка перестанет проходить.

Ниже — что вошло в релиз, что ломается и в каком порядке обновляться. Если вы только присматриваетесь к стеку, начните с объяснения, что такое Flutter и Dart простыми словами, и с описания того, как у нас устроена разработка приложений на Flutter.

Что изменилось во Flutter 3.50 и Dart 3.14

  • Дизайн-системы отделены от фреймворка. package:flutter/material.dart, package:flutter/cupertino.dart и их делегаты локализации в flutter_localizations помечены устаревшими. Замена — пакеты material_ui и cupertino_ui; новые проекты из flutter create сразу импортируют material_ui.
  • Прямой нативный interop. FFIgen (Objective-C и C) и JNIgen (Java и Kotlin) стабильны: Dart вызывает нативный код напрямую, без сериализации и обязательной асинхронности platform channels. Режим нативного interop в Pigeon пока в превью.
  • Dart 3.14. Появилась команда dart migrate для перехода на следующую версию языка. Старые JS-библиотеки dart:html, dart:js, dart:js_util и package:js устарели, вместо них — dart:js_interop и package:web.
  • Веб. По данным Google, WebAssembly-сборка в Safari 26.2+ и Firefox 147+ даёт более чем вдвое выше частоту кадров, чем JavaScript, на тяжёлых бенчмарках виджетов. Флаг --web-content-hash добавляет хеши в имена файлов, превью WebParagraph уменьшает загрузку CanvasKit примерно с 5,46 до 3,75 МБ.
  • iOS. Задержка касаний уменьшена на целый кадр: на 16 мс на экранах 60 Гц и на 8 мс на 120 Гц ProMotion. Исправлены падения при запуске на iOS 27, вернулся flutter screenshot для реальных устройств.
  • ИИ-инструменты. Официальные плагины для ИИ-агентов, настройка MCP-сервера Dart и Flutter, а также «навыки» в каталоге skills/ пакетов pub.dev. Переименование в больших workspace в анализаторе ускорилось на 57%.

Что сломается при обновлении

Код не перестанет компилироваться в 3.50, но несколько изменений требуют действий уже сейчас:

  • Android-плагины. Плагины, которые вручную подключают Kotlin Gradle Plugin, должны перейти на встроенный Kotlin и выставить ограничение flutter: ">=3.44.0". Иначе — пониженный рейтинг на pub.dev и несовместимость с будущим AGP 10.
  • Новые значения по умолчанию. AGP 9.3.1, Gradle 9.5.0, минимум Java 17, compileSdk и targetSdk — API 36, minSdk — API 24.
  • Intent в релизных сборках Android. Значения route, dart_entrypoint и cached_engine_id из внешних Intent теперь игнорируются, флаги движка вроде --dart-flags отклоняются. Если на этом держались диплинки, их нужно перенести на штатную маршрутизацию.
  • iOS и CocoaPods. По данным Google, в декабре 2026 года trunk CocoaPods станет доступен только для чтения. Отключение Swift Package Manager теперь вызывает предупреждение, а саму возможность отключения уберут в одном из следующих релизов.
  • Мелкие изменения API. У IgnorePointer и AbsorbPointer удалено свойство ignoringSemantics, в мультиоконном API десктопа RegularWindow переименован в Window.

Порядок миграции: пять шагов

  1. Включите Swift Package Manager в iOS-проекте и проверьте, что все плагины собираются без CocoaPods.
  2. Перенесите импорты дизайн-библиотек: dart fix --apply --code=migrate_design_widgets, затем проверьте собственные виджеты-обёртки над Material.
  3. Обновите Android-плагины на встроенный Kotlin и сверьте build.gradle с новыми значениями AGP и SDK.
  4. Проверьте веб-сборку: flutter build web --no-deprecated-js-interop покажет импорты, которые придётся заменить.
  5. Прогоните dart migrate --dry-run, чтобы заранее увидеть, что изменится при переходе на следующую версию языка.

Что Flutter 3.50 меняет для бизнеса и продуктовых команд

Вынос Material и Cupertino из SDK означает, что дизайн-компоненты теперь обновляются своим циклом, а не вместе с фреймворком. Для продукта это плюс: исправления в компонентах приходят быстрее. Но в проекте становится больше зависимостей, за которыми нужно следить.

Стабильные FFIgen и JNIgen упрощают работу с нативными SDK платёжных систем, камер и биометрии: меньше прослоек — меньше мест, где что-то ломается. По данным Google, в Google Play опубликовано больше миллиона приложений на Flutter, и миграция коснётся почти каждого из них.

Часто задаваемые вопросы

Перестанет ли собираться старый код после обновления до 3.50? Нет. Встроенные Material и Cupertino объявлены устаревшими, но не удалены: анализатор выдаёт предупреждения, сборка проходит.

Когда встроенные библиотеки уберут окончательно? Точную версию Google не назвала — сказано только, что удаление будет в одном из будущих релизов. Миграцию на material_ui можно было начинать ещё с Flutter 3.47.

Нужно ли переписывать platform channels на FFIgen и JNIgen? Не обязательно, каналы продолжают работать. Переходить имеет смысл там, где важны скорость и синхронные вызовы нативного кода.

Источники

Материал подготовлен редакцией YuSMP Group по открытым источникам. Нужна экспертиза по теме или разработка под задачу — обсудим проект.

Переведём ваше приложение на Flutter 3.50

Перенесём импорты на material_ui и cupertino_ui, обновим Android-плагины под AGP 9 и встроенный Kotlin, переведём iOS-сборку на Swift Package Manager до заморозки CocoaPods и прогоним регресс на обеих платформах.

Обсудить обновление на Flutter