Реагирование на действия флоу - Kotlin Multiplatform
Если вы создаёте флоу или пейволы с помощью Adapty Flow Builder или Paywall Builder, важно правильно настроить кнопки:
- Добавьте кнопку в Builder и назначьте ей существующее действие или создайте собственный ID действия.
- Напишите код в приложении для обработки каждого назначенного действия.
В этом гайде показано, как обрабатывать пользовательские и встроенные действия в коде.
Покупки, восстановление покупок, закрытие флоу/пейвола и открытие ссылок обрабатываются автоматически. Все остальные действия кнопок, например пользовательские действия, требуют явной реализации в коде приложения.
Настройка AdaptyUIFlowsEventsObserver
Чтобы обрабатывать действия флоу, нужно реализовать интерфейс AdaptyUIFlowsEventsObserver и зарегистрировать его через AdaptyUI.setFlowsEventsObserver(). Это следует сделать как можно раньше в жизненном цикле приложения — как правило, в основной активности или при инициализации приложения.
// In your app initialization
AdaptyUI.setFlowsEventsObserver(MyAdaptyUIFlowsEventsObserver())Все действия кнопок поступают в колбэк flowViewDidPerformAction(view, action) в виде sealed-класса AdaptyUIAction: CloseAction, AndroidSystemBackAction, OpenUrlAction или CustomAction.
Переопределение flowViewDidPerformAction заменяет обработку по умолчанию для всех действий, а не только для того, которое вас интересует. Оставляйте ветки по умолчанию для CloseAction (закрыть флоу) и OpenUrlAction (открыть URL), если вы не планируете их менять, — как показано в примерах ниже.
Закрытие флоу и пейволов
Чтобы добавить кнопку закрытия флоу или пейвола:
- В конструкторе добавьте кнопку и назначьте ей действие Close.
- В коде приложения реализуйте обработчик действия
close, который скрывает флоу.
В Kotlin Multiplatform SDK действие CloseAction по умолчанию закрывает флоу или пейвол. Однако при необходимости это поведение можно переопределить в коде — например, закрытие одного флоу может вызывать открытие другого.
class MyAdaptyUIFlowsEventsObserver : AdaptyUIFlowsEventsObserver {
override fun flowViewDidPerformAction(view: AdaptyUIFlowView, action: AdaptyUIAction) {
when (action) {
is AdaptyUIAction.CloseAction ->
mainUiScope.launch { view.dismiss() } // default behavior
is AdaptyUIAction.OpenUrlAction ->
AdaptyUI.openWebUrl(action.url, action.openIn) // default behavior
else -> Unit
}
}
}
// Set up the observer
AdaptyUI.setFlowsEventsObserver(MyAdaptyUIFlowsEventsObserver())Если вы используете createNativeFlowView, вызов view.dismiss() не даст никакого эффекта — представление встроено в ваш макет, а не отображается через стек KMP. Удалите представление из макета и вызовите вместо этого dispose().
Обработка системной кнопки «Назад» на Android
Нажатие системной кнопки «Назад» на Android (или соответствующий жест) генерирует AdaptyUIAction.AndroidSystemBackAction. По умолчанию это действие игнорируется — флоу остаётся открытым, и пользователь выходит из него через путь, который вы определяете, например кнопку Close или действие on_device_back в билдере. Если вы хотите, чтобы системная кнопка «Назад» закрывала флоу, обработайте это действие самостоятельно:
class MyAdaptyUIFlowsEventsObserver : AdaptyUIFlowsEventsObserver {
override fun flowViewDidPerformAction(view: AdaptyUIFlowView, action: AdaptyUIAction) {
when (action) {
is AdaptyUIAction.CloseAction ->
mainUiScope.launch { view.dismiss() } // default behavior
is AdaptyUIAction.AndroidSystemBackAction ->
mainUiScope.launch { view.dismiss() } // not handled by default
is AdaptyUIAction.OpenUrlAction ->
AdaptyUI.openWebUrl(action.url, action.openIn) // default behavior
else -> Unit
}
}
}Открытие URL из флоу и пейволов
Если нужно добавить группу ссылок (например, условия использования и восстановление покупок), добавьте элемент Link в билдере и обработайте его так же, как кнопки с действием Open URL.
Чтобы добавить кнопку, открывающую ссылку из флоу или пейвола (например, Terms of use или Privacy policy), в билдере добавьте кнопку, назначьте ей действие Open URL и введите нужный URL.
По умолчанию SDK открывает полученный URL нативно — во внешнем или встроенном браузере, в зависимости от action.openIn — так что никакого кода писать не нужно. Переопределите обработчик только если требуется кастомная логика, например показ диалога подтверждения перед открытием:
class MyAdaptyUIFlowsEventsObserver(
private val uriHandler: UriHandler
) : AdaptyUIFlowsEventsObserver {
override fun flowViewDidPerformAction(view: AdaptyUIFlowView, action: AdaptyUIAction) {
when (action) {
is AdaptyUIAction.OpenUrlAction -> {
// Show confirmation dialog before opening URL
mainUiScope.launch {
val selectedAction = view.showDialog(
title = "Open URL?",
content = action.url,
primaryActionTitle = "Cancel",
secondaryActionTitle = "Open"
).getOrNull()
when (selectedAction) {
AdaptyUIDialogActionType.PRIMARY -> {
// User cancelled
}
AdaptyUIDialogActionType.SECONDARY -> {
// User confirmed - open URL
uriHandler.openUri(action.url)
}
else -> Unit
}
}
}
else -> Unit
}
}
}
// Set up the observer with UriHandler
AdaptyUI.setFlowsEventsObserver(MyAdaptyUIFlowsEventsObserver(uriHandler))Войдите в приложение
Чтобы добавить кнопку входа в приложение:
- В конструкторе добавьте кнопку и назначьте ей действие Custom с ID «login».
- В коде приложения реализуйте обработчик этого пользовательского действия, который идентифицирует пользователя.
class MyAdaptyUIFlowsEventsObserver : AdaptyUIFlowsEventsObserver {
override fun flowViewDidPerformAction(view: AdaptyUIFlowView, action: AdaptyUIAction) {
when (action) {
is AdaptyUIAction.CustomAction -> {
if (action.action == "login") {
// Handle login action - navigate to login screen
// This depends on your app's navigation system
// For example, in Compose Multiplatform:
// navController.navigate("login")
}
}
else -> Unit
}
}
}Обработка пользовательских действий
Чтобы добавить кнопку для обработки любых других действий:
- В конструкторе добавьте кнопку, назначьте ей действие Custom и задайте ей ID.
- В коде приложения реализуйте обработчик для созданного вами ID действия.
Например, если у вас есть другой набор предложений подписки или разовых покупок, вы можете добавить кнопку, которая будет отображать другой флоу или пейвол:
class MyAdaptyUIFlowsEventsObserver : AdaptyUIFlowsEventsObserver {
override fun flowViewDidPerformAction(view: AdaptyUIFlowView, action: AdaptyUIAction) {
when (action) {
is AdaptyUIAction.CustomAction -> {
when (action.action) {
"openNewFlow" -> {
// Display another flow or paywall
}
}
}
else -> Unit
}
}
}
// Set up the observer
AdaptyUI.setFlowsEventsObserver(MyAdaptyUIFlowsEventsObserver())Только покупки и восстановления обрабатываются автоматически. Все остальные действия кнопок, такие как закрытие пейволов или открытие ссылок, требуют реализации соответствующих обработчиков в коде приложения.
Если вы создаёте пейволы с помощью Paywall Builder в Adapty, важно правильно настроить кнопки:
- Добавьте кнопку в Paywall Builder и назначьте ей готовое действие или создайте собственный ID действия.
- Напишите код в своём приложении для обработки каждого назначенного действия.
Этот гайд описывает, как обрабатывать пользовательские и встроенные действия в вашем коде.
Настройка AdaptyUIPaywallsEventsObserver
Чтобы обрабатывать действия на пейволе, нужно реализовать интерфейс AdaptyUIPaywallsEventsObserver и зарегистрировать его через AdaptyUI.setPaywallsEventsObserver(). Это следует делать как можно раньше в жизненном цикле приложения — обычно в главной активности или при инициализации приложения.
// In your app initialization
AdaptyUI.setPaywallsEventsObserver(MyAdaptyUIPaywallsEventsObserver())Закрытие пейволов
Чтобы добавить кнопку закрытия пейвола:
- В Paywall Builder добавьте кнопку и назначьте ей действие Close.
- В коде приложения реализуйте обработчик действия
close, который закрывает пейвол.
В SDK для Kotlin Multiplatform CloseAction и AndroidSystemBackAction по умолчанию вызывают закрытие пейвола. При необходимости это поведение можно переопределить в коде. Например, закрытие одного пейвола может инициировать открытие другого.
class MyAdaptyUIPaywallsEventsObserver : AdaptyUIPaywallsEventsObserver {
override fun paywallViewDidPerformAction(view: AdaptyUIPaywallView, action: AdaptyUIAction) {
when (action) {
AdaptyUIAction.CloseAction, AdaptyUIAction.AndroidSystemBackAction -> view.dismiss()
}
}
}
// Set up the observer
AdaptyUI.setPaywallsEventsObserver(MyAdaptyUIPaywallsEventsObserver())Если вы используете createNativePaywallView, вызов view.dismiss() не даст никакого эффекта — представление встроено в ваш макет, а не показано через стек KMP. Удалите представление из макета и вызовите на нём dispose().
Открытие URL с пейволов
Если вы хотите добавить группу ссылок (например, пользовательское соглашение и восстановление покупок), добавьте элемент Link в Paywall Builder и обработайте его так же, как кнопки с действием Open URL.
Чтобы добавить кнопку, открывающую ссылку с вашего пейвола (например, Terms of use или Privacy policy):
- В Paywall Builder добавьте кнопку, назначьте ей действие Open URL и введите URL, который нужно открыть.
- В коде приложения реализуйте обработчик действия
openUrl, который открывает полученный URL в браузере.
В Kotlin Multiplatform SDK OpenUrlAction предоставляет URL, который нужно открыть. Вы можете реализовать собственную логику обработки открытия URL — например, показать диалог подтверждения или использовать предпочтительный способ обработки URL в вашем приложении.
class MyAdaptyUIPaywallsEventsObserver(
private val uriHandler: UriHandler
) : AdaptyUIPaywallsEventsObserver {
override fun paywallViewDidPerformAction(view: AdaptyUIPaywallView, action: AdaptyUIAction) {
when (action) {
is AdaptyUIAction.OpenUrlAction -> {
// Show confirmation dialog before opening URL
mainUiScope.launch {
val selectedAction = view.showDialog(
title = "Open URL?",
content = action.url,
primaryActionTitle = "Cancel",
secondaryActionTitle = "Open"
).getOrNull()
when (selectedAction) {
AdaptyUIDialogActionType.PRIMARY -> {
// User cancelled
}
AdaptyUIDialogActionType.SECONDARY -> {
// User confirmed - open URL
uriHandler.openUri(action.url)
}
else -> Unit
}
}
}
}
}
}
// Set up the observer with UriHandler
AdaptyUI.setPaywallsEventsObserver(MyAdaptyUIPaywallsEventsObserver(uriHandler))Войдите в приложение
Чтобы добавить кнопку для входа пользователей в ваше приложение:
- В Paywall Builder добавьте кнопку и назначьте ей действие Custom с ID “login”.
- В коде вашего приложения реализуйте обработчик этого действия, который идентифицирует пользователя.
class MyAdaptyUIObserver : AdaptyUIObserver {
override fun paywallViewDidPerformAction(view: AdaptyUIView, action: AdaptyUIAction) {
when (action) {
is AdaptyUIAction.CustomAction -> {
if (action.action == "login") {
// Handle login action - navigate to login screen
// This depends on your app's navigation system
// For example, in Compose Multiplatform:
// navController.navigate("login")
}
}
}
}
}Обработка пользовательских действий
Чтобы добавить кнопку, выполняющую произвольное действие:
- В Paywall Builder добавьте кнопку, назначьте ей действие Custom и укажите идентификатор.
- В коде приложения реализуйте обработчик для созданного идентификатора действия.
Например, если у вас есть другой набор предложений по подписке или разовых покупок, можно добавить кнопку, которая откроет другой пейвол:
class MyAdaptyUIPaywallsEventsObserver : AdaptyUIPaywallsEventsObserver {
override fun paywallViewDidPerformAction(view: AdaptyUIPaywallView, action: AdaptyUIAction) {
when (action) {
is AdaptyUIAction.CustomAction -> {
when (action.action) {
"login" -> {
// Handle login action - navigate to login screen
// This depends on your app's navigation system
// For example, in Compose Multiplatform:
// navController.navigate("login")
}
}
}
}
}
}
// Set up the observer
AdaptyUI.setPaywallsEventsObserver(MyAdaptyUIPaywallsEventsObserver())