Получение флоу и пейволов — Flutter
getFlow После того как вы разработали свой флоу, его можно отобразить в мобильном приложении. Первый шаг — получить флоу или пейвол, связанный с плейсментом, и его конфигурацию отображения, как описано ниже.
Обратите внимание: эта тема относится к флоу и пейволам, созданным в конструкторах Adapty. Если вы реализуете пейволы вручную, обратитесь к разделу Получение пейволов и продуктов для пейволов с Remote Config в мобильном приложении.
Хотите увидеть реальный пример интеграции Adapty SDK в мобильное приложение? Посмотрите наши примеры приложений, которые демонстрируют полную настройку, включая отображение пейволов, совершение покупок и другую базовую функциональность.
Прежде чем начать
Вам понадобится:
- Продукты в дашборде Adapty: Создайте продукты.
- Флоу с продуктами: Создайте его в Flow & Paywall Builder и назначьте продукты.
- Плейсмент: Создайте плейсмент и назначьте ему флоу.
- Установленный SDK: Смотрите руководство по установке Flutter SDK.
Получение флоу/пейвола
Если вы создали флоу или пейвол в конструкторе, не нужно беспокоиться о его рендеринге в коде мобильного приложения для отображения пользователю. Такой флоу или пейвол содержит всё необходимое — и что именно показывать, и как это делать. Тем не менее, вам нужно получить его ID через плейсмент, конфигурацию его представления, а затем отобразить в мобильном приложении.
Загрузите флоу или пейвол и создайте его представление как можно раньше — желательно задолго до его отображения. Метод createFlowView загружает конфигурацию представления и начинает скачивать и кешировать изображения в фоне. Чем раньше вы его вызовете, тем больше времени останется на завершение загрузок. К моменту показа флоу или пейвола его конфигурация и изображения уже могут быть закешированы и готовы к отображению.
Чтобы получить флоу или пейвол, используйте метод getFlow:
try {
final flow = await Adapty().getFlow(placementId: 'YOUR_PLACEMENT_ID');
// запрошенный флоу/пейвол
} on AdaptyError catch (adaptyError) {
// обработка ошибки
} catch (e) {
// обработка ошибки
}Параметры:
| Параметр | Наличие | Описание |
|---|---|---|
| placementId | обязательный | Идентификатор нужного плейсмента. Это значение вы указали при создании плейсмента в дашборде Adapty. |
| fetchPolicy | по умолчанию: .reloadRevalidatingCacheData | По умолчанию SDK пытается загрузить данные с сервера и возвращает кэшированные данные в случае ошибки. Мы рекомендуем этот вариант, так как он гарантирует, что пользователи всегда получают самые актуальные данные. Однако если у ваших пользователей нестабильное интернет-соединение, рассмотрите использование Обратите внимание: кэш сохраняется при перезапуске приложения и очищается только при его переустановке или ручной очистке. Adapty SDK хранит пейволы локально в двух слоях: регулярно обновляемый кэш, описанный выше, и резервные пейволы. Для более быстрой загрузки пейволов также используется CDN и отдельный резервный сервер на случай недоступности CDN. Такая система гарантирует, что вы всегда получаете актуальную версию пейволов, обеспечивая надёжность даже при слабом интернет-соединении. |
| loadTimeout | по умолчанию: 5 сек |
Обратите внимание: в редких случаях метод может завершиться с задержкой относительно значения, указанного в |
Параметры ответа
| Параметр | Описание |
|---|---|
| Flow | Объект AdaptyFlow с идентификаторами флоу (instanceIdentity, variationId), именем, плейсментом, вариантами пейволов (paywalls) и Remote Config (remoteConfigs). |
Получение конфигурации представления
Убедитесь, что опубликовали флоу. Флоу с неопубликованными изменениями имеет статус Dirty, и его плейсмент продолжает показывать последнюю опубликованную версию.
Если плейсмент был создан в Flow & Paywall Builder или в старом Paywall Builder, Adapty самостоятельно отрисовывает UI — свойство hasViewConfiguration полученного флоу равно true. Создайте представление с помощью createFlowView, затем отобразите флоу или пейвол. Если плейсмент представляет собой кастомный пейвол без UI из Builder (hasViewConfiguration равно false), обработайте его как пейвол на основе Remote Config.
Результат метода createFlowView можно использовать для отображения только один раз. Если нужно показать его снова, вызовите метод createFlowView заново.
try {
final view = await AdaptyUI().createFlowView(flow: flow);
} on AdaptyError catch (e) {
// handle the error
} catch (e) {
// handle the error
}Параметры:
| Параметр | Наличие | Описание |
|---|---|---|
| flow | required | Объект AdaptyFlow для получения представления нужного флоу/пейвола. |
| locale | optional | Идентификатор локализации флоу для отрисовки представления — например, en или pt-br. Если не указан, представление отображается на en или в локализации флоу по умолчанию, если en отсутствует. См. Локализации и коды локалей. |
| customLayoutId | optional default: SDK 4.1+ | Пользовательский идентификатор макета в конфигурации макетов флоу. Передайте его, чтобы отрисовать конкретный макет вместо того, который SDK выбирает автоматически исходя из типа устройства и размера экрана. Если ни один макет не соответствует идентификатору, вызов завершится с ошибкой AdaptyError. Flow & Paywall Builder пока не присваивает пользовательские идентификаторы макетам, поэтому оставьте это поле пустым. |
| customTags | optional | Карта пользовательских тегов и их значений, используемых в качестве плейсхолдеров в контенте. Пользовательские теги применяются только к пейволам старого билдера — во флоу вместо них используются переменные. |
| preloadProducts | optional | Включите для оптимизации времени отображения продуктов на экране. При значении true AdaptyUI автоматически загрузит необходимые продукты. По умолчанию: false. |
| loadTimeout | optional | Объект Duration, ограничивающий время загрузки конфигурации представления. По истечении таймаута будут использованы кешированные данные или локальный резервный вариант. |
Если вы используете несколько языков, узнайте, как добавить локализацию флоу и как правильно использовать коды локалей здесь.
После того как вы получили представление, отобразите флоу/пейвол.
Получение флоу или пейвола для аудитории по умолчанию ради ускорения загрузки
Как правило, флоу и пейволы загружаются почти мгновенно, поэтому беспокоиться об ускорении этого процесса не нужно. Однако если у вас много аудиторий и плейсментов, а у пользователей слабое интернет-соединение, загрузка флоу или пейвола может занять больше времени, чем хотелось бы. В таких ситуациях имеет смысл показывать флоу или пейвол по умолчанию — это обеспечит плавный пользовательский опыт вместо пустого экрана.
Чтобы решить эту проблему, используйте метод getFlowForDefaultAudience, который получает флоу или пейвол указанного плейсмента для аудитории All Users. Однако важно понимать, что рекомендуемый подход — получать флоу или пейвол через метод getFlow, как описано в разделе Получение флоу/пейвола выше.
Почему мы рекомендуем использовать getFlow
Метод getFlowForDefaultAudience имеет ряд существенных недостатков:
- Потенциальные проблемы обратной совместимости: если вам нужно показывать разные пейволы для разных версий приложения (текущей и будущих), могут возникнуть сложности. Придётся либо проектировать пейволы с поддержкой текущей (устаревшей) версии, либо мириться с тем, что пользователи этой версии могут столкнуться с нерендеренными пейволами.
- Потеря таргетинга: все пользователи будут видеть один и тот же пейвол, настроенный для аудитории All Users, — это означает потерю персонализированного таргетинга (в том числе по странам, маркетинговой атрибуции или собственным пользовательским атрибутам).
Если вы готовы принять эти недостатки ради более быстрой загрузки флоу или пейвола, используйте метод getFlowForDefaultAudience следующим образом. В противном случае используйте getFlow, описанный выше.
try {
final flow = await Adapty().getFlowForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID');
// the requested flow/paywall
} on AdaptyError catch (adaptyError) {
// handle error
} catch (e) {
// handle unknown error
}
| Параметр | Наличие | Описание |
|---|---|---|
| placementId | обязательный | Идентификатор плейсмента. Это значение вы указали при создании плейсмента в дашборде Adapty. |
| fetchPolicy | по умолчанию: .reloadRevalidatingCacheData | По умолчанию SDK пытается загрузить данные с сервера и возвращает кэшированные данные в случае неудачи. Мы рекомендуем этот вариант, поскольку он гарантирует, что пользователи всегда получают самые актуальные данные. Однако если вы считаете, что у ваших пользователей нестабильный интернет, рассмотрите вариант Обратите внимание: кэш сохраняется при перезапуске приложения и очищается только при его переустановке или при ручной очистке. |
Настройка ассетов
Чтобы настроить изображения и видео в своём флоу/пейволе, используйте кастомные ассеты.
У изображений-героев и видео-героев есть предопределённые ID: hero_image и hero_video. В бандле кастомных ассетов вы обращаетесь к этим элементам по их ID и настраиваете их поведение.
Для остальных изображений и видео необходимо задать кастомный ID в дашборде Adapty.
Например, вы можете:
- Показывать разное изображение или видео отдельным пользователям.
- Показывать локальное превью-изображение, пока загружается основное удалённое изображение.
- Показывать превью-изображение перед воспроизведением видео.
Вот пример того, как можно передать пользовательские ресурсы через простой словарь:
final customAssets = {
// Show a local image using a custom ID
'custom_image': AdaptyCustomAsset.localImageAsset(
assetId: 'assets/images/image_name.png',
),
// Show a local video with a preview image
'hero_video': AdaptyCustomAsset.localVideoAsset(
assetId: 'assets/videos/custom_video.mp4',
),
};
try {
final view = await AdaptyUI().createFlowView(
flow: flow,
customAssets: customAssets,
);
} on AdaptyError catch (e) {
// handle the error
} catch (e) {
// handle the error
}Если ресурс не найден, флоу/пейвол вернётся к внешнему виду по умолчанию.
Настройка таймеров, определяемых разработчиком
Чтобы использовать кастомные таймеры в мобильном приложении, передайте карту customTimers в метод createFlowView. Каждый ключ карты — это идентификатор таймера, а значение — объект DateTime, определяющий момент окончания таймера. Пример:
try {
final view = await AdaptyUI().createFlowView(
flow: flow,
customTimers: {
'CUSTOM_TIMER_6H': DateTime.now().add(const Duration(seconds: 3600 * 6)),
'CUSTOM_TIMER_NY': DateTime(2027, 1, 1), // New Year 2027
},
);
} on AdaptyError catch (e) {
// handle the error
} catch (e) {
// handle the error
}В этом примере CUSTOM_TIMER_NY и CUSTOM_TIMER_6H — это Timer ID таймеров, заданных разработчиком в дашборде Adapty. Словарь customTimers обеспечивает динамическое обновление каждого таймера с нужным значением. Например:
CUSTOM_TIMER_NY: время, оставшееся до конца отсчёта таймера, например до Нового года.CUSTOM_TIMER_6H: время, оставшееся в 6-часовом периоде, который начался, когда пользователь открыл флоу.
После того как вы разработали визуальную часть пейвола в старом Paywall Builder на дашборде Adapty, его можно отобразить в мобильном приложении. Первый шаг — получить пейвол, связанный с плейсментом, и его конфигурацию отображения, как описано ниже.
Пейволы, созданные в Paywall Builder для SDK 3.x, требуют Flutter SDK версии 3.3.0 или выше.
Обратите внимание, что этот раздел посвящён пейволам, настроенным с помощью Paywall Builder. Если вы реализуете пейволы вручную, обратитесь к разделу Получение пейволов и продуктов для Remote Config пейволов в вашем мобильном приложении.
Хотите увидеть реальный пример интеграции Adapty SDK в мобильное приложение? Посмотрите наши примеры приложений, которые демонстрируют полную настройку, включая отображение пейволов, совершение покупок и другую базовую функциональность.
Прежде чем начать отображать пейволы в вашем мобильном приложении (нажмите, чтобы развернуть)
- Создайте продукты в дашборде Adapty.
- Создайте пейвол и добавьте в него продукты в дашборде Adapty.
- Создайте плейсменты и добавьте в них пейвол в дашборде Adapty.
- Установите Adapty SDK в своё мобильное приложение.
Получение пейвола, созданного в Paywall Builder
Если вы создали пейвол с помощью Paywall Builder, вам не нужно беспокоиться о его отображении в коде мобильного приложения. Такой пейвол содержит как то, что должно быть показано, так и то, как именно это должно быть показано. Тем не менее, вам нужно получить его ID через плейсмент, конфигурацию отображения, а затем показать пейвол в вашем мобильном приложении.
Для обеспечения оптимальной производительности крайне важно получать пейвол и его конфигурацию отображения как можно раньше, чтобы изображения успели загрузиться до того, как пользователь увидит пейвол.
Для получения пейвола используйте метод getPaywall:
try {
final paywall = await Adapty().getPaywall(placementId: "YOUR_PLACEMENT_ID", locale: "en");
// the requested paywall
} on AdaptyError catch (adaptyError) {
// handle the error
} catch (e) {
}Параметры:
| Параметр | Обязательность | Описание |
|---|---|---|
| placementId | обязательный | Идентификатор нужного плейсмента. Это значение вы указали при создании плейсмента в дашборде Adapty. |
| locale | необязательный по умолчанию: | Идентификатор локализации пейвола. Ожидается код языка, состоящий из одного или двух субтегов, разделённых символом минус (-). Первый субтег обозначает язык, второй — регион. Пример: Подробнее о кодах локалей и рекомендациях по их использованию — в разделе Локализации и коды локалей. |
| fetchPolicy | по умолчанию: .reloadRevalidatingCacheData | По умолчанию SDK пытается загрузить данные с сервера и возвращает кешированные данные в случае ошибки. Мы рекомендуем этот вариант, поскольку он гарантирует, что пользователи всегда получают актуальные данные. Однако если у ваших пользователей нестабильный интернет, рассмотрите использование Обратите внимание: кеш сохраняется при перезапуске приложения и очищается только при его переустановке или принудительной очистке. Adapty SDK хранит пейволы локально в двух слоях: регулярно обновляемый кеш, описанный выше, и резервные пейволы. Также используется CDN для ускорения загрузки пейволов и отдельный резервный сервер на случай недоступности CDN. Эта система гарантирует, что вы всегда получаете актуальные версии пейволов, обеспечивая надёжность даже при нестабильном интернет-соединении. |
| loadTimeout | по умолчанию: 5 сек | Ограничивает время ожидания для этого метода. По истечении таймаута будут возвращены кешированные данные или локальный резервный пейвол. Обратите внимание: в редких случаях метод может завершиться с небольшой задержкой относительно значения Для Android: создать |
Параметры ответа:
| Параметр | Описание |
|---|---|
| Paywall | Объект AdaptyPaywall со списком идентификаторов продуктов, идентификатором пейвола, Remote Config и рядом других свойств. |
Получение конфигурации отображения пейвола, созданного в Paywall Builder
Убедитесь, что в Paywall Builder включён переключатель Show on device. Если эта опция не активирована, конфигурация отображения не будет доступна для получения.
После получения пейвола проверьте, содержит ли он ViewConfiguration — это означает, что пейвол был создан с помощью Paywall Builder. Это подскажет вам, как отображать пейвол. Если ViewConfiguration присутствует, обрабатывайте его как пейвол Paywall Builder; если нет, обрабатывайте его как пейвол с Remote Config.
try {
final view = await AdaptyUI().createPaywallView(
paywall: paywall,
);
} on AdaptyError catch (e) {
// handle the error
} catch (e) {
// handle the error
}Когда представление готово, покажите пейвол.
Получение пейвола для аудитории по умолчанию для более быстрой загрузки
Как правило, пейволы загружаются практически мгновенно, поэтому беспокоиться об ускорении этого процесса не нужно. Однако если у вас много аудиторий и пейволов, а интернет-соединение у пользователей нестабильное, загрузка пейвола может занять больше времени, чем хотелось бы. В таких случаях имеет смысл показывать пейвол для аудитории по умолчанию — это обеспечит плавный пользовательский опыт вместо ситуации, когда пейвол не отображается вовсе.
Чтобы решить эту задачу, вы можете использовать метод getPaywallForDefaultAudience, который загружает пейвол указанного плейсмента для аудитории All Users. Однако важно понимать, что рекомендуемый подход — загружать пейвол методом getPaywall, как описано в разделе Получение информации о пейволе выше.
Почему мы рекомендуем использовать getPaywall
Метод getPaywallForDefaultAudience имеет ряд существенных недостатков:
- Возможные проблемы обратной совместимости: если вам нужно показывать разные пейволы для разных версий приложения (текущей и будущих), могут возникнуть трудности. Придётся либо создавать пейволы, совместимые с текущей (устаревшей) версией, либо смириться с тем, что пользователи на текущей (устаревшей) версии могут столкнуться с нерендерящимися пейволами.
- Потеря таргетинга: все пользователи будут видеть один и тот же пейвол, созданный для аудитории All Users, — то есть вы теряете персонализированный таргетинг (включая таргетинг по странам, маркетинговой атрибуции или собственным пользовательским атрибутам).
Если вы готовы принять эти ограничения ради более быстрой загрузки пейвола, используйте метод getPaywallForDefaultAudience следующим образом. В противном случае придерживайтесь метода getPaywall, описанного выше.
try {
final paywall = await Adapty().getPaywallForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID');
} on AdaptyError catch (adaptyError) {
// handle error
} catch (e) {
// handle unknown error
}Метод getPaywallForDefaultAudience доступен начиная с Flutter SDK версии 3.2.0.
| Параметр | Наличие | Описание |
|---|---|---|
| placementId | обязательный | Идентификатор плейсмента. Это значение, которое вы указали при создании плейсмента в дашборде Adapty. |
| locale | опциональный по умолчанию: | Идентификатор локализации пейвола. Ожидается, что этот параметр будет языковым кодом, состоящим из одного или нескольких подтегов, разделённых символом минуса (-). Первый подтег — язык, второй — регион. Пример: Подробнее о кодах локалей и рекомендациях по их использованию см. в разделе Локализации и коды локалей. |
| fetchPolicy | по умолчанию: .reloadRevalidatingCacheData | По умолчанию SDK пытается загрузить данные с сервера и возвращает кэшированные данные в случае ошибки. Мы рекомендуем этот вариант, так как он гарантирует, что пользователи всегда получают актуальные данные. Однако если у ваших пользователей нестабильное интернет-соединение, рассмотрите использование Обратите внимание, что кэш сохраняется при перезапуске приложения и очищается только при переустановке приложения или вручную. |
Настройка ресурсов
Чтобы настроить изображения и видео на пейволе, реализуйте пользовательские ресурсы.
Для изображений-заголовков и видео-заголовков есть предопределённые идентификаторы: hero_image и hero_video. В пакете пользовательских ресурсов вы обращаетесь к этим элементам по их идентификаторам и настраиваете их поведение.
Для других изображений и видео нужно задать пользовательский идентификатор в дашборде Adapty.
Например, вы можете:
- Показывать разные изображения или видео разным пользователям.
- Показывать локальное превью, пока загружается основное удалённое изображение.
- Показывать превью перед запуском видео.
Чтобы использовать эту функцию, обновите Flutter SDK Adapty до версии 3.8.0 или выше.
Вот пример того, как можно передавать пользовательские ресурсы через простой словарь:
final customAssets = {
// Show a local image using a custom ID
'custom_image': AdaptyCustomAsset.localImageAsset(
assetId: 'assets/images/image_name.png',
),
// Show a local video with a preview image
'hero_video': AdaptyCustomAsset.localVideoAsset(
assetId: 'assets/videos/custom_video.mp4',
),
};
try {
final view = await AdaptyUI().createPaywallView(
paywall: paywall,
customAssets: customAssets,
);
} on AdaptyError catch (e) {
// handle the error
} catch (e) {
// handle the error
}Если ресурс не найден, пейвол вернётся к внешнему виду по умолчанию.
Настройка таймеров, определяемых разработчиком
Чтобы использовать пользовательские таймеры в мобильном приложении, передайте словарь customTimers в метод createPaywallView. Каждый ключ словаря — это идентификатор таймера, а значение — объект DateTime, определяющий момент окончания таймера. Пример:
try {
final view = await AdaptyUI().createPaywallView(
paywall: paywall,
customTimers: {
'CUSTOM_TIMER_6H': DateTime.now().add(const Duration(seconds: 3600 * 6)),
'CUSTOM_TIMER_NY': DateTime(2025, 1, 1), // New Year 2025
},
);
} on AdaptyError catch (e) {
// handle the error
} catch (e) {
// handle the error
}В этом примере CUSTOM_TIMER_NY и CUSTOM_TIMER_6H — это Timer ID пользовательских таймеров, которые вы задали в дашборде Adapty. Словарь customTimers гарантирует, что приложение динамически обновит каждый таймер с нужным значением. Например:
CUSTOM_TIMER_NY: время до окончания таймера, например до Нового года.CUSTOM_TIMER_6H: оставшееся время в 6-часовом периоде, который начался, когда пользователь открыл пейвол.