Собственный код

Готовых виджетов и действий FlutterFlow хватает надолго, но не навсегда. Когда нужного нет, задача решается собственным кодом.

Способов несколько:

совет
Зачем это нужно
  • Функциональность, которой нет в стандартном наборе.
  • Интеграции со сторонними пакетами, API и базами, требующими особой обработки.
  • Нестандартный интерфейс — элементы со своей отрисовкой и поведением.

Где писать

Собственный код живёт в проекте рядом с тем, что его использует: функции, действия, виджеты и файлы кода группируются вместе со страницами и компонентами своей функции.

внимание

Снимки на этой странице сделаны в новом интерфейсе редактора собственного кода. Переключиться на него можно кнопкой Try New Layout на панели инструментов.

Переключение необратимо: вернуться к прежнему редактору в этом проекте уже не получится. Чтобы посмотреть без риска, создайте отдельную ветку и переключайтесь в ней.

Писать код можно двумя способами:

  1. Во встроенном редакторе.
  2. В расширении для Visual Studio Code.

Встроенный редактор

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

custom-code-common.avif

совет

Значок VS Code открывает тот же файл в Visual Studio Code через расширение FlutterFlow — там доступно всё, чего нет во встроенном редакторе.

open-in-vscode

внимание
Редактор в десктопном приложении

В десктопной версии встроенный редактор урезан. Пользуйтесь веб-версией или расширением для VS Code.

Code Copilot

Code Copilot пишет код по текстовому описанию: вы формулируете задачу — «посчитать общую стоимость товаров в корзине», — он выдаёт заготовку.

Полезнее всего для собственных функций и действий.

инфо
Ограничение

Запрос должен быть не короче трёх слов и не длиннее 500 символов.

Компиляция

Кнопка Compile Code проверяет, что код собирается и будет работать в приложении.

compile-errors.avif

Так выглядят ошибки компиляции

Собственные функции обязаны быть скомпилированы — без этого приложение не запустится.

Собственные виджеты и действия компилировать необязательно: код выгрузится и приложение запустится. Но до компиляции виджеты не видны в предпросмотре, а в проекте висит предупреждение.

Функции компилируются быстро, действия и виджеты иногда заметно дольше.

Анализатор кода

Анализатор проверяет код на ошибки и предупреждения по ходу написания.

code-analyzer

При ошибке компиляции анализатор останавливается и показывает то, что нашёл компилятор. После исправления сохраните код и перезапустите анализатор.

Автоматические импорты

В каждый новый фрагмент собственного кода FlutterFlow сам добавляет базовые импорты; менять их нельзя. В функциях свои импорты запрещены вовсе, в действиях и виджетах их добавляют после строки «Do not remove or modify the code above».

automatic-imports.png

Настройки

При открытии фрагмента справа появляется меню настроек. Набор слегка отличается для действий, функций и виджетов; ниже — общее.

Generate Boilerplate Code

Генерирует заготовку: нужные импорты и каркас функции или виджета.

copy-boilerplate-code.png

Создайте файл, нажмите значок кода в меню настроек, затем Copy to Editor — заготовка попадёт в редактор.

References

Показывает, где в проекте используется этот фрагмент кода.

внимание

Включённые References замедляют открытие редактора: FlutterFlow приходится обойти весь проект и собрать места использования.

references

Exclude From Compilation

Исключает проблемный фрагмент из компиляции, чтобы остальной код всё же собрался.

совет
Где доступно

Только для собственных виджетов и действий. ::: action-settings.avif

Include BuildContext

Передаёт в действие BuildContext вызвавшего виджета. Нужно, когда действию требуется доступ к дереву виджетов или к данным из контекста.

:::tip[Где доступно] Только для собственных действий.

Входные аргументы

Аргументы делают код переиспользуемым: одна и та же функция работает с разными данными.

Пример действия с двумя аргументами: cartItems типа List of ItemsStruct и productId типа String. action-arguments.png

совет
Свои типы данных в коде

Свой тип данных в сгенерированном коде называется <ИмяТипа>Struct. Тип Items превращается в ItemsStruct.

Обратный вызов как параметр

Обратный вызов — действие, переданное параметром в собственное действие или виджет и запускаемое им позже, когда что-то произошло.

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

совет
Что такое обратный вызов

Это функция, переданная другой функции, чтобы та вызвала её при наступлении события.

В примере собственное действие принимает обратный вызов onError(searchKeyword) с параметром searchKeyword — то есть при вызове оно передаёт поисковый запрос обратно.

explain-callback-action.png

Как назначить действие обратному вызову

В примере на onError вешается действие «Show Snackbar», выводящее сообщение с поисковым запросом:

Возвращаемые значения

Собственный код может не только принимать аргументы, но и возвращать результат обратно в приложение.

внимание
Где доступно

Только для собственных функций и действий. Собственные виджеты возвращать значение не умеют.

Пример действия, возвращающего целое число, которое может быть null:

return-value-actions.png

Описание

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

adding-description.avif

Описание видно подсказкой при наведении на зелёный значок заметки.

description-note

совет

В сгенерированном коде описание становится комментарием перед определением функции и отображается в редакторе.

description-in-custom-code

Как это организовать

Страницы, компоненты и собственный код можно складывать в одни и те же папки — тогда всё, что относится к одной функции приложения, лежит рядом.

Например, в папке Cart со страницами и компонентами корзины уместна и функция calculateCartTotals.

Подключение пакета

Pub.dev — официальный репозиторий пакетов Dart и Flutter.

инфо
Пакеты Flutter Favorite

Flutter Favorite — отобранный командой Flutter набор пакетов, отмеченных за качество и надёжность. Значок Flutter Favorite — хороший ориентир при выборе.

Список — на странице Flutter Favorites.

Пакет подключается в Settings and Integrations > Project Dependencies, вкладка Custom Dependencies: нажмите Add Pub Dependency, введите имя пакета и версию, нажмите Add.

Как выбрать пакет

Под любую задачу на pub.dev найдётся несколько пакетов, и выбрать бывает непросто.

На что смотреть:

  • WEB — поддержка веба обязательна, иначе приложение не запустится в Run/Test Mode.
  • Likes — сколько разработчиков отметили пакет.
  • Pub Points — оценка качества из 130 баллов: стиль кода, поддержка платформ, сопровождаемость.
  • Popularity — доля приложений, использующих пакет; косвенный признак стабильности.
  • Документация — понятные примеры и внятный README экономят часы.
  • Дата последнего обновления — заброшенный пакет рано или поздно перестанет собираться с новой версией Flutter.

Dependency-score.png

Для подключения понадобятся две вещи: имя пакета с версией и строка импорта.

Пакеты не с pub.dev

FlutterFlow умеет подключать пакеты, которых нет на pub.dev, — из публичных и закрытых репозиториев.

инфо
Когда это нужно
  • Другая ветка пакета — нужна возможность, которой ещё нет в релизе.
  • Свой форк — вы поправили пакет сами, потому что сопровождающий не отвечает.
  • Внутренние библиотеки компании, которые нельзя публиковать.

Из публичного репозитория

Для пакета, лежащего на GitHub, указывается адрес репозитория:

  package_name:
    git:
      url: https://github.com/username/repository_name.git

Уточнить можно параметрами ref и path:

  • Конкретная ветка (например, development):
  package_name:
    git:
      url: https://github.com/username/repository_name.git
      ref: development
  • Конкретный коммит:
dependencies:
  package_name:
    git:
      url: https://github.com/username/repository_name.git
      ref: a1b2c3d4
  • Пакет в подкаталоге репозитория:
  package_name:
    git:
      url: https://github.com/username/repository_name.git
      path: packages/subpackage_name

Как это делается:

Из закрытого репозитория

Здесь нужна авторизация — по HTTPS с персональным токеном доступа.

Для GitHub создайте токен с нужными правами. Лучше — токен с ограниченными правами, дающий доступ только к нужному репозиторию.

package_name:
    git:
      url: https://<username>:<personal-access-token>@github.com/username/private_repo.git

Подставьте своё имя пользователя вместо <username> и токен вместо <personal-access-token>.

Что взять со страницы пакета

  1. Имя пакета и версию

На странице пакета на pub.dev нажмите значок Copy to Clipboard рядом с именем и версией и вставьте это в раздел Pubspec Dependency справа внизу редактора.

package-dependency-version-copy

Разбор — в примере.

внимание

У пакета могут быть свои зависимости — их имена и версии нужно указать тоже. Список приведён в разделе Dependencies справа внизу на странице пакета.

img_1.png

  1. Строку импорта

Импорт указывает, откуда берётся код пакета. Он добавляется в конец блока стандартных импортов в редакторе.

Найти его можно на вкладке Installing в разделе Import It; рядом есть значок копирования.

copy-import-statement.png

  1. Пример кода

Он лежит на вкладке Example. Скопируйте нужный фрагмент в свой виджет или действие и доработайте под задачу.

Пример подключения

Разберём на пакете flutter_rating_bar: из его примера собирается собственный виджет ProductRatingBar для страницы товара.

заметка

Здесь пакет подключается к собственному виджету, но для собственного действия порядок тот же. Подробнее — про собственные виджеты и собственные действия.

Управление зависимостями

Зависимости управляются в Settings and Integrations > Project Dependencies, вкладка Custom Dependencies.

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

перевод официальной документации FlutterFlow

обновлено

ESC