Показ медиа
Картинки, звук, видео и PDF показываются готовыми виджетами. Ниже — откуда виджет берёт файл, что у каждого настраивается и как сделать так, чтобы медиа не тормозило приложение.
Источники медиа
Источник задаётся в Properties Panel свойством [Media] Type — ImageType, AudioType, VideoType и так далее.
Network
Адрес файла вводится прямо в поле Path. Это для медиа, лежащего в интернете.

Если файл загружен в Firebase или Supabase, нажмите Set from Variable у поля Path и выберите Source → Widget State > Uploaded File URL.

Если файл ушёл через API, выберите Source → Action Outputs > [имя переменной] (API Response). В ответе API должна быть ссылка на файл; как её достать — см. JSON-путь.

На случай долгой или неудачной загрузки задайте заглушку: нажмите Set from Variable у поля Path и укажите адрес заглушки в свойстве Default Value.
Asset
Файлы можно положить прямо в проект — в Assets. Это картинки, видео, документы, шрифты. Загружаются они через пункт Media Assets в меню слева или кнопкой загрузки в настройках самого виджета.
Как ресурсы лежат в проекте — см. каталог Assets в сгенерированном коде.

Uploaded File
Файл, который временно лежит на устройстве, доступен через Widget State > Uploaded Local File. Так делают предпросмотр перед отправкой в облако.

AudioPlayer
AudioPlayer проигрывает звук — из ресурсов проекта или по внешней ссылке. Откуда брать файл, описано в разделе источников.
Виджет собран на пакете assets_audio_player.
Настройки
- Title — название дорожки. Задаётся текстом или переменной: состоянием приложения, ответом API, полем документа.
- Pause on Forward Navigation — по умолчанию звук останавливается при переходе на другую страницу.
- Play in Background — что делать, когда приложение свернули:
- Enabled — продолжать играть;
- Disabled, restore on foreground — поставить на паузу и продолжить при возврате;
- Disabled, pause — остановить сразу.
- Цвета:
- Fill Color — фон виджета;
- цвета кнопок воспроизведения и паузы;
- Active/Inactive Track Color — цвет пройденной и оставшейся части полосы прогресса.
- Elevation — тень под плиткой; 0 убирает её.
- Текст:
- Title Text Style — шрифт, размер и цвет названия;
- Playback Duration Text Style — оформление таймера.
Запись звука
Запись собирается двумя действиями — Start Audio Recording и Stop Audio Recording.
В режимах Run и Test запись звука не работает — проверять нужно на устройстве.
Start Audio Recording
Действие начинает запись и даёт ей имя, по которому её потом останавливает Stop Audio Recording.
Перед ним нужно запросить разрешение на микрофон и добавить Start Audio Recording в ветку TRUE проверки разрешения. Поле Name по умолчанию заполнено случайной строкой — замените её на осмысленную.
Сразу после старта стоит обновить переменные состояния: отключить кнопку записи, запустить анимацию. Иначе пользователь не понимает, идёт запись или нет.

Stop Audio Recording
Если записей несколько, все имена объектов записи перечислены в списке Recorder Name — выберите нужный.
Как настроить:
- Выберите Recorder Name — то имя, что задано в Start Audio Recording.
- Задайте Action Output Variable Name — в него ляжет сама запись типа Audio Path, её принимает аудиоплеер.
- Чтобы отправить запись в Firebase или Supabase, добавьте действие Upload file:
- задайте Upload Type;
- File Type — Uploaded File: Stop Audio Recording кладёт байты записи в состояние виджета;
- File to Upload — Widget State > Recorded File.
- Для отправки через API действие загрузки не нужно: добавьте вызов API напрямую. Тело запроса должно быть в формате Multipart, а запись передаётся через Widget State > Recorded File — см. настройку multipart-запроса.
- После остановки так же обновите состояние: верните кнопки в исходный вид, остановите анимацию.
- Предусмотрите аварийную остановку. Триггер On Dispose остановит запись, даже если пользователь просто закрыл экран.
Воспроизведение записи
Передайте Action Output Variable Name виджету AudioPlayer — запись начнёт играть.
Play Sound и Stop Sound
Эти действия нужны для коротких звуков — откликов и уведомлений.
Play Sound
Play Sound проигрывает звук в ответ на действие: список обновился, сообщение отправлено.
Только для коротких звуков. Для длинных дорожек берите виджет AudioPlayer.
Действию по умолчанию присваивается случайное Name — по нему звук потом останавливает Stop Sound. Громкость задаётся ползунком Volume (0.0 — тишина, 1.0 — полная). Следующее действие в потоке запускается сразу; чтобы дождаться конца звука, включите Await Playback.
- Отклик — на нажатие кнопки, отправку формы, ошибку.
- Уведомления — напоминания, сообщения, завершение задачи.
- Игры — достижения, переходы между уровнями.
Stop Sound
Останавливает звук, запущенный действием Play Sound, — например, при сворачивании приложения.
Действие доступно только если на странице есть Play Sound.
VideoPlayer
VideoPlayer показывает видео из ресурсов проекта или по ссылке. Поддерживаются MP4, MOV, WAV, MPEG и live-фото JPEG. Откуда брать файл — см. источники.
Виджет собран на пакете video_player.
Настройки
- Aspect Ratio — соотношение сторон: 1.7 соответствует 16:9.
- AutoPlay — запускать видео при открытии страницы.
- Loop Video — повторять после окончания.
- Show Controls — показывать кнопки воспроизведения и полосу перемотки.
- Allow Full Screen — разрешить полноэкранный режим.
- Playback Speed Menu — дать менять скорость воспроизведения.
- Load on Page Load — начать загрузку заранее, при открытии страницы: видео стартует без паузы на буферизацию.
- Pause on Forward Navigation — ставить на паузу при уходе со страницы.
YoutubePlayer
YoutubePlayer встраивает ролики с YouTube.
Виджет собран на доработанной версии пакета youtube_player_iframe из репозитория FlutterFlow.
Настройки
- Loop Video — повторять после окончания.
- Mute Video — запускать без звука.
- Show Controls — показывать кнопки, громкость, субтитры и полноэкранный режим.
- Show Full Screen Control — только кнопку полноэкранного режима.
- Pause on Forward Navigation — ставить на паузу при уходе со страницы.
- Strict Related Videos — показывать в конце ролики только того же канала.
PdfViewer
PdfViewer показывает PDF — из сети или из ресурсов проекта. Откуда брать файл — см. источники.
Виджет собран на пакете pdfx.
Настройки
- Horizontal Scroll — листать страницы по горизонтали вместо вертикали.
- Use Proxy — в Run Mode и Test Mode FlutterFlow тянет PDF через свой прокси, чтобы обойти ограничения CORS. Выключите, если этого не нужно.
- Use Custom Proxy URL — свой прокси вместо стандартного.
Доступ к PDF из веба
В вебе часть файлов требует дополнительной настройки. PdfViewer’у нужно, чтобы хранилище разрешало запросы с другого домена — то есть чтобы был настроен CORS.
Ниже — как включить CORS для проекта Firebase. Программировать не нужно; официальная инструкция — Firebase CORS Configuration.
Шаг 1. Узнать Project ID
Идентификатор проекта лежит в FlutterFlow > Settings and Integrations > Firebase. Скопируйте Firebase Project ID.

Шаг 2. Открыть Cloud Shell
- Откройте ссылку, подставив вместо FIREBASE_PROJECT_ID свой идентификатор:
https://console.cloud.google.com/home/dashboard?cloudshell=true&project=FIREBASE_PROJECT_ID
- Если появится запрос, нажмите Continue.
- Внизу экрана откроется терминал. Если идентификатор проекта не подсвечен жёлтым, нажмите стрелку вниз рядом с именем проекта и выберите нужный.

Шаг 3. Выполнить команду
- Щёлкните по терминалу Cloud Shell.
- Вставьте команду, подставив вместо
<your-cloud-storage-bucket>имя своего хранилища. Найти его можно в консоли Firebase: Storage, слева вверху будет адрес видаyour-project-id.appspot.com.
touch cors.json && \
echo '[{"origin": ["*"], "method": ["GET"], "maxAgeSeconds": 3600}]' > cors.json && \
gsutil cors set cors.json gs://<your-cloud-storage-bucket>

- Нажмите Enter.
- Если появится запрос, нажмите Authorize.
- При успешном выполнении команда напечатает подтверждение.

BlurHash
BlurHash — короткая строка, из которой восстанавливается размытая версия картинки. Её показывают, пока грузится оригинал: экран выглядит заполненным с первого кадра, а не мигает пустотой.

Порядок такой:
- В действии Upload/Save Media включите Include Blur Hash — строка сгенерируется при загрузке картинки.

- Сохраните её в базу рядом со ссылкой на картинку. Строка доступна в Widget State > Uploaded Local File > Media Blur Hash.

- В свойствах виджета Image включите Use Blur Hash и задайте Blur Hash String из переменной.

Что помогает не тормозить
- Включайте бесконечную прокрутку в списках: содержимое подгружается по мере пролистывания, а не всё сразу.
- Пользуйтесь встроенным кешем картинок FlutterFlow.
- Включайте кеширование запросов — часто запрашиваемые данные останутся на устройстве.
- Запрашивайте только то, что действительно показываете на экране.
- Следите за запросами к базе: лишние поля и лишние документы стоят и времени, и денег.
- Показывайте BlurHash, пока грузится картинка.
- Показывайте индикатор загрузки — иначе пауза читается как зависание.