DevGang
Авторизоваться

Руководство по Flutter для разработчиков React

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

В этой статье не ставится вопрос о том, следует ли вам использовать Flutter, React Native, PWA или нативное приложение. Для каждого из них есть хорошие варианты использования. Сегодня мы сосредоточимся на Flutter для разработки мобильных приложений. Давайте погрузимся!

VS Code → VS Code

Большинство разработчиков Flutter пишут код с помощью тех же инструментов, что и веб-разработчики.

VS Code с расширением Flutter - самый популярный вариант.

Android Studio имеет первоклассную поддержку Flutter, если вам удобнее работать с IntelliJ IDEA. Мы выбрали этот вариант и были им вполне довольны.

Как и в случае с любой другой установкой для мобильной разработки, требуется время, чтобы подготовить все для кроссплатформенной разработки. Чтобы помочь разработчикам устранять неполадки в их локальной настройке, Flutter поставляется с удобной утилитой flutter doctor:

Начните работу с локальной средой разработки:

Лично мы нашли процесс начальной установки более простым, чем для React Native.

Chrome Dev Tools → Flutter Dev tools

Трудно представить веб-разработку без мощных инструментов разработки, которые есть в наших браузерах.

Удивительно, но Flutter не сильно отстает. Мы начали использовать Flutter widget inspector с 1-го дня для отладки проблем со стилем наших виджетов. Как и в Chrome, Flutter Inspector имеет несколько вкладок - от сети до производительности. Там было интересно изучить наше приложение с разных сторон.

Наконец, вы можете отлаживать код Flutter из своей IDE, используя точки останова. По какой-то причине мы все еще предпочитаем console.log() в JavaScript!

Начните работу с инструментами Flutter Dev:

  1. DevTools — официальная документация

TypeScript → Dart

Flutter использует язык программирования Dart. Dart похож на JavaScript, но с типами и приятным синтаксическим сахаром.

Например, в Dart есть асинхронный функционал, но Promises там называются Futures.

Если нам нужен массив в смысле JavaScript, в Dart мы используем список:

var nav = ['Home', 'Furniture', 'Plants', if (promoActive) 'Outlet'];

Пример выше — это список строк. Последний элемент добавляется только в том случае, если значение promoActive равно true.

Начните с Dart:

Наш опыт работы с Dart пока был только положительным. Вам не нужно тратить время на настройку TypeScript или Webpack. В Dart все встроено и готово к использованию.

ESlint → Dart lint

Dart & Flutter имеют встроенные инструменты анализа и форматирования кода. Это облегчает изучение лучших практик фреймворка. Мы были довольны настройкой линтеров по умолчанию, но ее тоже можно настроить.

Начните работу с линтерами:

div → Widget

Все, что есть во Flutter, - это виджет.

If you compare them to HTML tags, Flutter widgets are usually much more specialised.

Например, “to center a div” в Flutter вы используете специализированный виджет Center:

Center(
    child: const Text("I’m centered!")
),

Требуется время, чтобы ознакомиться со всеми встроенными виджетами Flutter. Думаем, что не исследовали даже половину из них.

Начните работу с Widgets:

Нам не очень нравился способ Flutter передавать детей как свойства. Лично нам с синтаксисом JSX проще работать.

CSS → Widget

Все - это виджет, помните?

Flutter не поддерживает CSS. Вместо этого весь стиль обрабатывается виджетами и их свойствами.

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

Padding(
   padding: EdgeInsets.all(16),
   child: Center(child: Text("I’m centered!")),
);

EdgeInsets.all(16) означает отступ: 16px.

Flutter работает в логических пикселях и заботится о переводе наших значений в физические пиксели для каждого устройства и типа экрана.

Теперь давайте добавим черную рамку с радиусом границы вокруг предыдущего виджета:

DecoratedBox(
      decoration: BoxDecoration(
        border: Border.all(
          color: Colors.black,
          width: 1,
        ),
        borderRadius: BorderRadius.circular(12),
      ),
      child: const Padding(
        padding: EdgeInsets.all(16),
        child: Center(child: Text("I’m centered!")),
      ),
)

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

Начните работу с Widgets:

  1. Просмотрите каталог виджетов, чтобы узнать, что доступно.
  2. Регулярно смотрите короткие видеоролики “Widget of the Week” от официальной команды Flutter.
  3. Как выбрать, какой Flutter Animation Widget подходит именно вам? - отличный обзор анимации флаттера.

Accessibility → Widget (снова!)

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

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

Начните со accessibility:

@mui → Material Components (MDC)

@mui — это реализация Material Design для React. При использовании @mui в качестве библиотеки компонентов вы сначала создаете тему верхнего уровня, предоставляете ее через React Context, а затем наслаждаетесь единым стилем для всех своих компонентов.

Ниже показано, как можно напечатать заголовок с помощью @mui:

<Typography variant="h4">Heading 4</Typography>

Flutter поставляется с Material Components (MDC) из коробки. Технически вы можете отказаться и пойти своим путем, но мы еще не исследовали этот маршрут.

Подобно реализации React, различные аспекты темы сначала настраиваются на верхнем уровне приложения, а затем повторно используются в отдельных виджетах, например:

Text(
    'Heading 4',
    style: Theme.of(context).textTheme.headline4,
)

Начать работу с Material:

Будьте готовы к крутой кривой обучения: сотни виджетов и свойств, сложная настройка темы материалов и, конечно же, особенности мобильных устройств, которых нет в Интернете.

Render → Build

Виджеты Flutter — это классы, которые должны реализовывать метод сборки. Он похож на метод рендеринга в компонентах класса React.

Давайте реализуем метод сборки для нашего примера «centered div» из начала этого руководства:

class CenteredText extends StatelessWidget {
  const CenteredText({super.key, required this.text});
  // Props are class members in Flutter.
  final String text;

  // Widget must implement the build method.
  @override
  Widget build(BuildContext context) {
    return Center(child: Text(text));
  }
}

Если у вас был негативный опыт работы с классовыми компонентами в React, отложите его на время. Flutter основан на Dart, и его реализация класса намного надежнее и продуманнее, чем в JavaScript.

Начните создавать собственные виджеты:

  1. Как создать виджеты без состояния из серии видеороликов Flutter in Focus

State → State

Цитата из документации Flutter:

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

Фактическая реализация виджетов с состоянием отличается от того, как мы создаем компоненты с состоянием в React. Вместо добавления одной строки кода с помощью хука useState вам нужно создать два (!) отдельных объекта: один для виджета с состоянием, а другой — для его состояния. Интересно, почему? Подробности смотрите по ссылкам ниже.

К счастью, и в VS Code, и в Android Studio есть ярлыки для создания виджетов Flutter. На практике мы можем создавать виджеты Flutter так же быстро, как и новые компоненты React.

Начните работу с виджетами с отслеживанием состояния:

npm → pub.dev

pub.dev — официальный репозиторий пакетов для приложений Dart и Flutter. Мы нашли его очень чистым и удобным для разработчиков.

Pub.dev продвигает высококачественные пакеты через программу Flutter Favorite и шоу Package of the Week на YouTube.

В каталоге приложения Flutter есть два файла, связанных с pub.dev: pubspec.yaml и pubspec.lock (эквиваленты package.json и package.lock).

Начните работу с pub.dev:

  • Зайдите на pub.dev и изучите пакеты

Redux + React Query → Riverpod

Как и в случае с React, экосистема Flutter породила дюжину конкурирующих менеджеров состояний.

Некоторые опытные разработчики Flutter склоняются к Riverpod (№5 в таблице выше) при создании реальных сложных приложений. Мы доверяем их выбору.

Начните работу с Riverpod:

React Router → Go Router

Навигация в мобильном приложении сильно отличается от интернета. Встроенный Flutter Navigation API настолько сложен, что команда Flutter решила создать официальный сторонний пакет с более простым API: Go Router.

Как и в React Router, вы объявляете свои маршруты (и их подмаршруты) и сопоставляете их с экранами вашего приложения.

Начните работу с Go Router:

Backend → Firebase

Мобильные/десктопные приложения редко представляют собой статические целевые страницы. Почти всегда им требуется какой-то бэкенд для аутентификации, синхронизации данных, аналитики и многого другого. Тем не менее, большинство приложений никогда не станут популярными, а разработчики не хотят тратить месяцы на создание сложных серверных частей. Вот почему Firebase так популярен в мобильной разработке, включая Flutter. Он предлагает набор API для всех общих функций, которые могут вам понадобиться как мобильному разработчику, и все они бесплатны до определенного порога.

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

Начните работу с Firebase:

React Testing Library → flutter_test

Надежная экосистема тестирования — еще один признак серьезного подхода к качеству фреймворка.

Разработчики могут тестировать приложения Flutter с помощью следующих типов тестов:

  1. Unit — проверяет поведение метода или класса
  2. Widget — проверяет поведение виджетов Flutter без запуска самого приложения
  3. Golden — проверяет визуальный вывод виджетов Flutter без запуска самого приложения
  4. UI integration — проверяет полную работу пользовательского интерфейса приложения, запустив приложение на устройстве (некоторые сетевые службы могут быть подделаны)
  5. End-to-end —   то же, что и выше, но без каких-либо издевательств.

Пример теста виджета:

testWidgets('Testing MyWidget', (WidgetTester tester) async {
  await tester.pumpWidget(MyWidget());
  await tester.tap(find.text('Save'));
  await tester.pump();
  expect(find.text('Success'), findsOneWidget);
});

WidgetTester предоставляет API для программного управления виджетами; например, tester.tap(find.text('Save')) будет имитировать нажатие на кнопку «Save».

Для меня было довольно неожиданно найти инструменты визуального регрессионного тестирования (Golden image tests) в стандартной библиотеке тестирования. В дополнение к стандартным инструментам существует несколько внешних пакетов, которые помогают еще больше продвинуть тестирование флаттера.

Начать:

React Docs → docs.flutter.dev

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

Возможно, вам вообще не понадобятся какие-либо платные внешние ресурсы, чтобы стать разработчиком Flutter.

Что дальше

Мы надеемся, что это руководство поможет вам ориентироваться в мире Flutter как разработчику React. Если вы находитесь в самом начале, начните с кодовой метки “Ваше первое приложение Flutter”. Не стесняйтесь добавлять это руководство в закладки и возвращаться к нему по мере прохождения вашего путешествия!

#React #Начинающим #Flutter
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться