Flutter 2.8: что нового?

Перевод статьи What’s new in Flutter 2.8

Google,

Улучшения производительности, новые функции Firebase, состояние рабочего стола, обновления инструментария и многое другое!

В северном полушарии наступило то самое время года: листья кружатся, температура остывает, и вот последний стабильный релиз года уже здесь. Здравствуйте и добро пожаловать в Flutter 2.8! Этот релиз является результатом напряженной работы 207 участников и 178 рецензентов, в результате которой было объединено 2424 PR и закрыто 2976 проблем. Особая благодарность главному вкладчику сообщества в этот релиз, Бартошу Селвесюку, инженеру Flutter из Very Good Ventures, который предоставил 23 PR, большинство из которых были в основном «сфокусированы» (sic) вокруг плагина камеры для веб.

Вся эта коллективная работа привела к значительному повышению производительности движка и Flutter DevTools, стабильному релизу Google Mobile Ads SDK для Flutter, множеству новых функций и улучшений Firebase, WebView 3.0, новой партии пакетов Flutter Favorite, обновлению рабочего стола на пути к стабильному релизу и новой версии DartPad с поддержкой большего количества пакетов, включая сам Firebase. Возможно, это последний релиз года, но отнюдь не последний. Давайте же приступим!

Производительность

Как всегда, задача №1 в Flutter — это качество. Мы тратим много времени на то, чтобы Flutter работал настолько гладко и надежно, насколько это возможно на всех поддерживаемых устройствах.

Стартап

В этом выпуске улучшена задержка при запуске приложения. Эти улучшения тестировались на Google Pay, крупном популярном приложении с более чем 1 миллионом строк кода, чтобы гарантировать, что эти изменения приведут к ощутимому воздействию в реальном мире. Все вместе эти улучшения привели к снижению задержки при запуске Google Pay на 50% при работе на низкоуровневых устройствах Android и на 10% на высокоуровневых устройствах.

Улучшения в том, как Flutter влияет на политику сборки мусора Dart VM, теперь помогают избежать несвоевременных циклов GC во время запуска приложения. Например, перед отрисовкой первого кадра на Android, Flutter теперь уведомляет Dart VM о нехватке памяти только для сигналов TRIM_LEVEL_RUNNING_CRITICAL и выше. В ходе локального тестирования это изменение сократило время до первого кадра на 300 мс на устройстве низкого класса.

Из-за излишней осторожности в предыдущих выпусках Flutter блокировал поток платформы при создании представлений платформы. Тщательные рассуждения и тестирование показали, что часть сериализации можно удалить, что позволило устранить >100 мс блокировки при запуске Google Pay на устройстве низкого класса.

Ранее настройка менеджера шрифтов по умолчанию вносила искусственную задержку при установке первого изолята Dart. Отсрочка установки менеджера шрифтов по умолчанию для одновременного выполнения с установкой Dart Isolate улучшила задержку при запуске и сделала эффект от описанных выше оптимизаций более заметным, поскольку это было основным недостатком.

Память

Разработчики Flutter, нацеленные на устройства с ограниченным объемом памяти, испытывали проблемы с получением трасс производительности из-за того, что Flutter охотно загружал «сервисный изолят» Dart VM, чей AOT-код был связан с приложением, так что Flutter считывал оба кода в память одновременно. Для Android в версии 2.8 сервисный изолят Dart VM был разделен на собственный пакет, который может загружаться отдельно, что приводит к экономии памяти до 40 МБ, пока сервисный изолят не понадобится. Объем памяти уменьшился еще на 10% благодаря тому, что Dart VM informing the OS о том, что страницы памяти, используемые программой AOT, хранятся в файле, который, скорее всего, больше не потребуется читать. Поэтому страницы, на которых хранилась копия данных из файла, могут быть освобождены и использованы для других целей.

Профилирование

Иногда разработчики хотят просматривать данные трассировки производительности из Flutter наряду с событиями трассировки родного Android. Более того, они часто хотят видеть события трассировки даже в сборках в режиме релиза, чтобы лучше понять проблемы производительности в развернутых приложениях. С этой целью в стабильном релизе 2.8 теперь отправляются события трассировки в регистратор Android systrace, если он включен при запуске приложения, и эти события отправляются даже тогда, когда приложение Flutter создано в режиме релиза.

События трассировки Flutter теперь отображаются (внизу) в инструментах записи systrace для Android

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

Flutter DevTools

Для отладки проблем производительности в этом выпуске DevTools добавлена новая функция «Enhance Tracing«, которая поможет вам диагностировать ошибки пользовательского интерфейса, вызванные дорогостоящими операциями сборки, компоновки и рисования.

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

 

Кроме того, в этом выпуске DevTools добавлена новая поддержка профилирования производительности запуска вашего приложения. Этот профиль содержит образцы ЦП с момента инициализации Dart VM до момента рендеринга первого кадра Flutter. После нажатия кнопки «Profile app start up» и загрузки профиля запуска приложения вы увидите, что для профиля выбран тег пользователя «AppStartUp». Вы также можете загрузить профиль запуска приложения, выбрав этот фильтр тега пользователя, если он присутствует в списке доступных тегов пользователя. При выборе этого тега отображаются данные профиля запуска приложения.

Представления веб-платформы

Android и iOS — не единственные платформы, получившие улучшения производительности. В этом выпуске также улучшена производительность представлений платформы для Flutter web. Если вы не знакомы с представлениями платформы, то это способ, которым Flutter позволяет вам размещать в своем приложении нативные компоненты пользовательского интерфейса с базовой платформы. В Flutter web это реализовано с помощью виджета HtmlElementView, который позволяет размещать HTML-элементы внутри веб-приложения Flutter. Если вы используете веб-версии плагина google_maps_flutter или плагина video_player, или следуете советам команды Flutter о том, как оптимизировать отображение изображений в интернете, то вы используете представления платформы.

В предыдущих версиях Flutter встраивание представления платформы сразу создавало новый холст, а каждое дополнительное представление платформы добавляло еще один холст. Создание дополнительных холстов обходилось дорого, поскольку каждый из них имел размер всего окна. В этом выпуске повторно используются холсты, созданные для предыдущих представлений платформы, поэтому вместо того, чтобы нести затраты 60 раз в секунду, вы несете затраты один раз за все время существования приложения. Это означает, что вы можете использовать несколько экземпляров HtmlElementView в своих веб-приложениях без снижения производительности, а также уменьшить прокрутку при использовании представлений платформы.

Экосистема

Flutter — это не только фреймворк, движок и инструменты — на pub.dev представлено более 20 000 совместимых с Flutter пакетов и плагинов, и каждый день их становится все больше. Значительная часть того, с чем разработчики Flutter взаимодействуют ежедневно, является частью большой экосистемы, поэтому давайте посмотрим, что произошло в экосистеме Flutter с момента выхода предыдущего релиза.

GA of Flutter Ads

Первое и самое главное — это выпуск Google Mobile SDK для Flutter в общую доступность в ноябре.

 

Этот выпуск поддерживает 5 рекламных форматов, интегрирует поддержку AdMob и Ad Manager и включает бета-версию новой функции посредничества, которая поможет вам оптимизировать эффективность рекламы. Для получения дополнительной информации об интеграции Google Ads в ваше приложение Flutter, а также о других вариантах монетизации, посетите новую страницу монетизации на flutter.dev.

WebView 3.0

Еще один новый релиз, который на этот раз поставляется с Flutter, — это релиз 3.0 плагина webview_flutter. Мы увеличили номер версии из-за большого количества новых функций, а также из-за потенциально серьезного изменения в работе веб-представлений на Android. В предыдущих версиях webview_flutter режим гибридной композиции был доступен, но не использовался по умолчанию. Гибридная композиция устраняет ряд проблем, с которыми сталкивался предыдущий режим виртуальных дисплеев по умолчанию. Основываясь на отзывах пользователей и отслеживании проблем, мы считаем, что пришло время сделать гибридную композицию режимом по умолчанию. Кроме того,webview_flutter добавляет ряд очень востребованных функций:

  • Поддержка POST, а также GET для заполнения контента (4450447944804573)
  • Загрузка HTML из файлов и строк (4446448645444558)
  • Поддержка прозрачного фона (343145694570)
  • Запись файлов cookie перед загрузкой содержимого(455545564557)

Furthermore, in the 3.0 release, webview_flutter provides preliminary support for a new platform: the web. We’ve had many of you ask for the ability to host a webview in a Flutter web app, which allows you to build an app for mobile or web from a single code base. What does hosting a webview look like in a Flutter web app? Well, from a coding perspective, it looks just the same:

Более того, в релизе 3.0 webview_flutter обеспечивает предварительную поддержку новой платформы: веб. Многие из вас спрашивали о возможности размещения webview в веб-приложении Flutter, что позволяет создавать приложения для мобильных и веб-приложений на основе единой кодовой базы. Как выглядит размещение webview в веб-приложении Flutter? С точки зрения кодирования это выглядит точно так же:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:webview_flutter_web/webview_flutter_web.dart';

void main() {
  runApp(const MaterialApp(home: HomePage()));
}

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  void initState() {
    super.initState();

    // required while web support is in preview
    if (kIsWeb) WebView.platform = WebWebViewPlatform();
  }

  @override
  Widget build(BuildContext context) => Scaffold(
        appBar: AppBar(title: const Text('Flutter WebView example')),
        body: const WebView(initialUrl: 'https://flutter.dev'),
      );
}

 

При запуске в Интернете он работает так, как вы и ожидали:

Обратите внимание, что текущая реализация webview_flutter для web имеет ряд ограничений, основанных на том, что она построена с использованием iframe, который поддерживает только простую загрузку URL и не имеет возможности контролировать или взаимодействовать с загруженным содержимым (более подробную информацию можно найти в the webview_flutter_web README). Тем не менее, по многочисленным просьбам мы выкладываем webview_flutter_web в качестве неодобренного плагина. Если вы хотите попробовать, добавьте следующую строку в ваш pubspec.yaml:

dependencies:
  webview_flutter: ^3.0.0
  webview_flutter_web: ^0.1.0 # add unendorsed plugin explicitly

Если у вас есть замечания по webview_flutter v3.0, как в интернете, так и вне его, пожалуйста, опубликуйте их в репозитории Flutter как проблему webview. Кроме того, если вы еще не использовали webview или хотите освежить свои знания, ознакомьтесь с новым webview codelab, который шаг за шагом описывает процесс размещения веб-контента в вашем приложении Flutter.

Flutter Избранное

 Комитет экосистемы Flutter снова собрался, чтобы определить следующие пакеты как Flutter Favorite:

  • Три пользовательских пакета маршрутизаторов для нового API Router: beamer, routemaster и go_router
  • drift, переименование уже способной и популярной библиотеки реактивной персистентности для Flutter и Dart, построенной на базе sqlite.
  • freezed, «языковой патч» для Dart, обеспечивающий простой синтаксис для определения моделей, клонирования объектов, сопоставления шаблонов и многое другое.
  • dart_code_metrics
  • И несколько великолепно выглядящих пакетов GUI:flex_color_schemeflutter_svgfeedbacktoggle_switchauto_size_text.
Приложение Flexfold построено с использованием flex_color_scheme

 

Поздравляем авторов этих пакетов и благодарим вас за поддержку сообщества Flutter своим трудом. Если вы хотите номинировать свой любимый пакет Flutter на награду Flutter Favorite, следуйте указаниям и инструкциям на странице программы Flutter Favorite

Пакеты, специфичные для конкретной платформы

Если вы являетесь автором пакета, вам необходимо принять решение о том, какие платформы вы собираетесь поддерживать. Если вы создаете плагин с нативным кодом для конкретной платформы, вы можете сделать это с помощью свойства pluginClass в pubspec.yaml вашего проекта, которое указывает нативный класс, обеспечивающий функциональность:

flutter:
  plugin:
    platforms:
      android:
        package: com.example.hello
        pluginClass: HelloPlugin
      ios:
        pluginClass: HelloPlugin

Однако по мере развития  Dart FFI появляется возможность реализовать специфическую для платформы функциональность в 100% Dart, как это делает пакет path_provider_windows . Если у вас нет нативного класса для использования, но вы все равно хотите обозначить свой пакет как поддерживающий только определенные платформы, используйте свойство dartPluginClass:

flutter:
  plugin:
    implements: hello
    platforms:
      windows:
        dartPluginClass: HelloPluginWindows

Эта настройка обозначает ваш пакет как поддерживающий только определенные платформы, даже если у вас нет нативного кода. Вы также должны предоставить класс плагина Dart; узнайте больше в документации Dart-only platform implementations docs on flutter.dev.

Firebase

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

  • Все плагины FlutterFire переходят из бета-версии в стабильную.
  • Новая поддержка в DartPad для нескольких сервисов Firebase
  • Новые библиотеки для упрощения создания пользовательского интерфейса для аутентификации и живых запросов Firestore
  • Новое отображение объектов/документов Firestore для Flutter, доступное в Alpha

Production Quality

Плагины FlutterFire (почти) все перешли из бета-версии в стабильное качество.

 

Плагины, перешедшие в стабильную версию для Android, iOS и веб, включают в себя AnalyticsDynamic LinksIn-App MessagingPerformance MonitoringRealtime DatabaseRemote Config и, новичок на рынке,  Installations. Плагин App Check и поддержка платформы macOS все еще находятся в бета-версии, поскольку сами библиотеки Firebase находятся на стадии бета-версии. Если вы сомневались, что выбрать: Realtime Database, Analytics или Remote Config, потому что библиотеки FlutterFire не были готовы к началу работы, больше не волнуйтесь. Теперь это полностью поддерживаемые плагины, готовые к использованию на производстве.

Инициализация Firebase только для Dart

По мере перехода пакетов в производственное качество мы добавили возможность инициализировать Firebase на любой поддерживаемой платформе из Dart:

import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart'; // generated via `flutterfire` CLI

Future<void> main() async {
  // initialize firebase across all supported platforms
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);

  runApp(MyApp());
}

 

Этот код инициализирует приложение Firebase, используя опции, подходящие для каждой поддерживаемой платформы, как определено в файле firebase_options.dart, который содержит структуры данных для каждой платформы, которые выглядят следующим образом:

static const FirebaseOptions web = FirebaseOptions(
  apiKey: 'AIzaSyCZFKryCEiKhD0JMPeq_weJguspf09h7Cg',
  appId: '1:111079797892:web:b9195888086158195ffed1',
  messagingSenderId: '111079797892',
  projectId: 'flutterfire-fun',
  authDomain: 'flutterfire-fun.firebaseapp.com',
  storageBucket: 'flutterfire-fun.appspot.com',
  measurementId: 'G-K029Y6KJDX',
);

 

Чтобы собрать данные для структуры данных опций инициализации каждой платформы, воспользуйтесь новым инструментом flutterfire CLI .

Этот инструмент копается в данных в подпапках вашей платформы, чтобы найти уникальный ID пакета, а затем использует его для поиска деталей Firebase-проекта для ваших приложений, соответствующих платформе, даже создавая новый проект Firebase и/или новые приложения для платформы, если таковых нет. Для вас это означает, что больше не нужно скачивать и добавлять json-файл в проект Android, скачивать и добавлять plist-файл в проекты iOS и macOS или вставлять код в index.html веб-проекта — независимо от того, на какую поддерживаемую платформу Firebase вы ориентируетесь, этот единственный фрагмент кода Dart инициализирует Firebase для вашего приложения. Обратите внимание, что это может быть не единственная инициализация, которую вам нужно сделать, чтобы ваше приложение FlutterFire заработало; например, вы можете захотеть интегрировать создание символов Crashlytics в сборку Android или сборку iOS, но это поможет вам запустить его в считанные минуты с любым новым проектом Firebase.

Используйте Firebase с DartPad

С этой инициализацией FlutterFire только для Dart вы теперь можете использовать Firebase из DartPad.

Этот пример демонстрирует небольшое приложение для чата с использованием Flutter, Firebase и DartPad, все из которых вы можете использовать прямо сейчас без установки. Сегодня поддержка Firebase в DartPad уже включает в себя основные API, аутентификацию и Firestore. Ожидайте, что со временем в DartPad появится больше сервисов Firebase.

Еще одна вещь, которую дает поддержка FlutterFire в DartPad — это возможность использовать встроенный экземпляр DartPad прямо в документах.

В этом примере вы видите документацию по Cloud Firestore с кодом для примера приложения, которое вы можете запускать и редактировать прямо в браузере без необходимости устанавливать что-либо, создавать тестовый проект или даже копировать/вставлять код. Все это находится прямо здесь для вашего немедленного использования.

Пользовательский интерфейс Firebase

При интеграции Firebase в приложение большинство приложений имеют определенный поток аутентификации. Это включает в себя возможность входа пользователей с помощью электронной почты и пароля или с помощью социального провайдера аутентификации, такого как Google. Аутентификация Firebase также позволяет создавать новые учетные записи на лету, проверять адреса электронной почты, сбрасывать пароли, а также может включать двухэтапную верификацию с помощью SMS, вход по номеру телефона или даже объединение нескольких учетных записей пользователей в одну. Firebase Authentication поддерживает все эти функции, но вы, как разработчик Flutter, отвечаете за реализацию пользовательского интерфейса для всего этого. До сегодняшнего дня.

Сегодня мы рады сообщить, что пакет flutterfire_ui может создать базовую аутентификацию с помощью небольшого количества кода. В качестве примера, предположим, что в вашем проекте Firebase настроена аутентификация Email и Google:

С помощью этой конфигурации вы можете запустить процесс аутентификации следующим образом:

import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutterfire_ui/auth.dart';
import 'firebase_options.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) => MaterialApp(
        home: AuthenticationGate(),
      );
}

class AuthenticationGate extends StatelessWidget {
  const AuthenticationGate({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) => StreamBuilder<User?>(
        stream: FirebaseAuth.instance.authStateChanges(),
        builder: (context, snapshot) {
          // User is not signed in - show a sign-in screen
          if (!snapshot.hasData) {
            return SignInScreen(
              providerConfigs: [
                EmailProviderConfiguration(),
                GoogleProviderConfiguration(
                  clientId: 'xxxx-xxxx.apps.googleusercontent.com',
                ),
              ],
            );
          }

          return HomePage(); // show your app’s home page after login
        },
      );
}

 

Это инициализирует Firebase и, заметив, что пользователь еще не вошел в систему, показывает экран входа. Виджет SigninScreen настроен на провайдеров аутентификации Email и Google. Код также прослушивает состояние аутентификации пользователя с помощью пакета firebase_auth, поэтому, как только пользователь зарегистрировался, вы можете отобразить остальную часть приложения. С помощью этого кода вы получите рабочий вход для всех платформ, поддерживаемых Firebase: Android, iOS, web и macOS.

С небольшими дополнительными настройками вы можете легко добавить изображение и некоторый пользовательский текст (подробности доступны в документации), что даст вам полнофункциональный опыт входа в систему:

Этот скриншот показывает мобильную версию, но поскольку экраны flutterfire_ui являются отзывчивыми, вот что вы получите на десктопном устройстве:

 

Если у пользователя уже есть электронная почта/пароль, он может войти в систему и закончить работу. Если они используют Google auth, им будет показан обычный поток Google auth, независимо от того, где они находятся — на мобильном, веб-сайте или настольном компьютере. Если у них еще нет учетной записи, они могут нажать кнопку на экране входа и перейти к экрану регистрации. После входа или регистрации существуют потоки для подтверждения адреса электронной почты, сброса пароля, выхода из системы и привязки учетных записей социальной аутентификации. Вход по электронной почте работает на всех платформах наряду с поддержкой социальной аутентификации для Google, Facebook и Twitter, с частичной поддержкой Apple (на Android не работает). Поддержка аутентификации в flutterfire_ui поддерживает множество сценариев и схем навигации, а также возможности настройки и локализации. Ознакомьтесь с подробной документацией и примерами в документации firebase.flutter.dev.

Кроме того, аутентификация — не единственная функция пользовательского интерфейса Firebase, которую поддерживает flutterfire_ui. Для показа пользователям живого, бесконечно прокручиваемого списка данных из запроса Firebase в этом выпуске появился FirestoreListView, который вы можете добавить в свое приложение с живым запросом следующим образом:

class UserListView extends StatelessWidget {
  UserListView({Key? key}) : super(key: key);

  // live Firestore query
  final usersCollection = FirebaseFirestore.instance.collection('users');

  @override
  Widget build(BuildContext context) => Scaffold(
        appBar: AppBar(title: const Text('Contacts')),
        body: FirestoreListView<Map>(
          query: usersCollection,
          pageSize: 15,
          primary: true,
          padding: const EdgeInsets.all(8),
          itemBuilder: (context, snapshot) {
            final user = snapshot.data();

            return Column(
              children: [
                Row(
                  children: [
                    CircleAvatar(
                      child: Text((user['firstName'] ?? 'Unknown')[0]),
                    ),
                    const SizedBox(width: 8),
                    Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      mainAxisAlignment: MainAxisAlignment.center,
                      mainAxisSize: MainAxisSize.min,
                      children: [
                        Text(
                          '${user['firstName'] ?? 'unknown'} '
                          '${user['lastName'] ?? 'unknown'}',
                          style: Theme.of(context).textTheme.subtitle1,
                        ),
                        Text(
                          user['number'] ?? 'unknown',
                          style: Theme.of(context).textTheme.caption,
                        ),
                      ],
                    ),
                  ],
                ),
                const Divider(),
              ],
            );
          },
        ),
      );
}

 

А вот как это выглядит в действии:

Или, если вы хотите предоставить своим пользователям возможность создавать, читать, обновлять и удалять записи в таблице, у вас есть основы этого в FirestoreDataTable:

class FirestoreTableStory extends StatelessWidget {
  FirestoreTableStory({Key? key}) : super(key: key);

  // live Firestore query
  final usersCollection = FirebaseFirestore.instance.collection('users');

  @override
  Widget build(BuildContext context) {
    return FirestoreDataTable(
      query: usersCollection,
      columnLabels: const {
        'firstName': Text('First name'),
        'lastName': Text('Last name'),
        'prefix': Text('Prefix'),
        'userName': Text('User name'),
        'email': Text('Email'),
        'number': Text('Phone number'),
        'streetName': Text('Street name'),
        'city': Text('City'),
        'zipCode': Text('Zip code'),
        'country': Text('Country'),
      },
    );
  }
}

 

Это работает следующим образом:

Подробную информацию об аутентификации, представлениях списков и таблицах данных можно найти в документации flutterfire_ui. Поскольку это предварительный релиз, планируется выпуск дополнительных функций. Если у вас есть вопросы или пожелания, пожалуйста, зайдите в репозиторий на GitHub, чтобы зарегистрировать проблемы или задать вопросы в разделе обсуждения.

Сопоставление объектов/документов в Firestore

И, наконец, одна новая функция в интеграции Firebase и Flutter, о которой вы должны знать: альфа-релиз the Firestore Object/Document Mapper. Firestore ODM призван помочь разработчикам Flutter быть более продуктивными, упрощая использование Firestore через знакомые безопасные для типов, структурированные объекты и методы. Используя генерацию кода, Firestore ODM улучшает синтаксис взаимодействия с документами и коллекциями, позволяя моделировать данные безопасным для типов способом:

@JsonSerializable()
class Person {
  Person({required this.name, required this.age});

  final String name;
  final int age;
}

@Collection<Person>(‘/persons’)
final personsRef = PersonCollectionReference();

Имея эти типы, вы можете выполнять запросы, безопасные для типов:

personsRef.whereName(isEqualTo: 'Bob');
personsRef.whereAge(isGreaterThan: 42);

ODM также поддерживает определение сильно типизированных подколлекций и предоставляет встроенные опции для оптимизации перестройки виджетов с помощью функции select. Обо всем этом и многом другом вы можете прочитать в документации Firestore ODM . Поскольку это альфа-версия, пожалуйста, предоставьте обратную связь. Чтобы оставить отзыв и задать вопросы, присоединяйтесь к ветке Firestore ODM в обсуждении FlutterFire.

Desktop

Релиз Flutter 2.8 — это еще один большой шаг на пути к стабильному релизу для Windows, macOS и Linux. Планка качества высока, включая поддержку интернационализации и локализации, такую как недавно появившаяся поддержка китайского IME, корейского IME и Kanji IME. Или, например, тесная интеграция в поддержку доступности Windows. Недостаточно, чтобы Flutter работал на десктопе на стабильном канале (что он уже делает в бета-версии за флагом), он должен хорошо работать на языках и культурах всего мира и для людей с разными способностями. Это еще не совсем то, что мы хотим, но мы к этому идем!

Одним из примеров текущей работы по подготовке рабочего стола к стабильному релизу является полная перестройка архитектуры того, как Flutter обрабатывает события клавиатуры, чтобы обеспечить синхронную реакцию. Это позволяет виджету обрабатывать нажатие клавиши и отменять его распространение по остальному дереву. Первоначальная работа была завершена во Flutter 2.5, а во Flutter 2.8 добавлены исправления проблем и регрессий по мере приближения к стабильному качеству. Это дополнение к текущей работе по реинжинирингу того, как мы обрабатываем ввод с клавиатуры конкретного устройства, и рефакторингу того, как Flutter обрабатывает редактирование текста — все это необходимо для приложений для настольных компьютеров, интенсивно использующих ввод с клавиатуры.

In addition, we continue to expand Flutter’s support for visual density and expose alignment for dialogs, both to enable more desktop-friendly UI.
Кроме того, мы продолжаем расширять поддержку Flutter для визуальной плотности и выравнивания диалогов, чтобы сделать пользовательский интерфейс более удобным для настольных компьютеров.

И наконец, не только команда Flutter работает над Flutter desktop. В качестве примера можно привести команду разработчиков настольных систем Canonical, которая совместно с Invertase работает над реализацией для Linux и Windows самых популярных плагинов Firebase для Flutter.

Подробнее о предварительном выпуске можно прочитать в блоге Invertase.

DartPad

Релиз Flutter не является полным без обзора улучшений инструментария. Этот пост посвящен улучшениям в DartPad, главным из которых является поддержка большего количества пакетов. Фактически, для импорта доступны 23 пакета. Помимо нескольких сервисов Firebase, в список входят такие популярные пакеты, как bloccharacterscollectiongoogle_fonts, и flutter_riverpod. Команда DartPad продолжает добавлять новые пакеты, поэтому если вы хотите посмотреть, какие пакеты поддерживаются в настоящее время, нажмите на значок информации в правом нижнем углу.

 

Чтобы узнать план добавления новых пакетов в DartPad со временем, ознакомьтесь с этой статьей на Dart wiki.

Есть еще одна новая функция DartPad, которая тоже довольно удобна. Раньше DartPad всегда запускал последнюю стабильную версию. В этом выпуске вы можете выбрать как последнюю бета-версию канала, так и предыдущую стабильную версию (так называемый «старый канал»), используя новое меню Channel в строке состояния.

Это может быть очень полезно, если, например, вы пишете статью для блога, где последняя стабильная…

Удаление канала dev

Канал» Flutter определяет, насколько быстро меняется базовый фреймворк и движок Flutter на вашей машине разработки, при этом stable представляет собой наименьшую динамику, а master — наибольшую. Из-за нехватки ресурсов мы недавно перестали обновлять канал dev. Хотя мы получили несколько вопросов по этому поводу, мы обнаружили, что менее 3% разработчиков Flutter используют канал dev. Поэтому мы решили начать процесс официального выводаdev-канала из эксплуатации. Хотя канал dev используют немногие разработчики, его поддержка занимает у инженеров Flutter много времени и сил. Если вы проводите все свое время на стабильном канале (как делают более 90% разработчиков Flutter), вы не будете скучать по нему. Отказавшись от него, вам придется принимать на одно решение меньше, а команда Flutter сможет потратить свое время и энергию на другие вещи.

Вы можете решить, какой канал вам нужен, с помощью команды flutter channel. Вот что команда Flutter думает о каждом канале:

  • Стабильный(stable) канал представляет собой самые качественные сборки, которые у нас есть. Они выходят ежеквартально (примерно), и в промежутках между ними проводятся горячие исправления критических проблем. Это «медленный» канал: безопасный, зрелый, долгосрочное обслуживание.
  • Бета-канал представляет собой быстро развивающуюся альтернативу стабильному каналу для тех, кому удобен более быстрый ритм работы. В настоящее время выпускается ежемесячно, стабилизируется перед выпуском. Это «быстрый» канал. Если мы обнаружим, что канал dev удовлетворял потребности, которые канал beta не может удовлетворить в настоящее время, мы можем изменить наше представление о канале beta, чтобы удовлетворить и эти потребности (например, ускорить периодичность выпуска beta или снизить уровень тестирования и исправлений, которые мы выполняем в beta).
  • Канал master — это наш активный канал разработки. Мы не предоставляем никакой поддержки на этом канале, но мы запускаем полный набор модульных тестов на нем. Этот канал подходит для соавторов или опытных пользователей, которым удобно работать с нестабильными сборками. На этом канале мы работаем быстро и ломаем вещи (а затем также быстро их исправляем).

Поскольку в ближайшие месяцы мы выведем из эксплуатации канал dev, подумайте о beta— или master-каналах, в зависимости от вашей терпимости к оттоку и потребности в новейшем и самом лучшем.

Ломающие изменения

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

  • 90292 Устранение устареваний autovalidate
  • 90293 Устранить обесценивание FloatingHeaderSnapConfiguration.vsync
  • 90294 Устранить устаревание AndroidViewController.id
  • 90295 Устранение устаревания BottomNavigationBarItem.title
  • 90296 Удаление устаревших классов форматирования ввода текста

Если вы все еще используете эти API и хотите получить подробную информацию о том, как обновить свой код, вы можете прочитать руководство по миграции на сайте flutter.dev. Как всегда, большое спасибо сообществу за предоставленные тесты, которые помогают нам выявить эти изменения.

Итоги

Завершая 2021 год и предвкушая 2022-й, команда Flutter хотела бы выразить благодарность за работу и поддержку всего сообщества Flutter. Хотя это правда, что мы создаем Flutter для растущего числа разработчиков в мире, это также буквально правда, что мы не смогли бы создать его без вас. Сообщество Flutter не похоже ни на какое другое, и мы благодарны за все, что вы делаете. Счастливого праздничного сезона и до встречи в новом году!

Меню